2012-07-19 21 views
5

Estoy tratando de hacer conversiones tipo utilizando un generador, pero quiero pasar al siguiente elemento en el iterador una vez que obtenga un valor exitosamente. Mi intento actual arrojará valores múltiples en los casos donde las expresiones son exitosas:Rendimiento solo una vez por iteración

def type_convert(data): 
    for item in data: 
     try: 
      yield int(item) 
     except (ValueError, TypeError) as WrongTypeError: 
      pass 
     try: 
      yield float(item) 
     except (ValueError, TypeError) as WrongTypeError: 
      pass 
     yield item 

¿Cómo se logra esto?

+0

I' Estoy bastante seguro de que me estoy perdiendo algo, pero ¿cuál es el caso en el que tu elenco 'int' fallará pero tu conversión a' float' tendrá éxito? –

+2

@NolenRoyalty - considere la cadena: ''1.0'' – mgilson

+0

@mgilson que tiene perfecto sentido, gracias: D –

Respuesta

4

Usted debe ser capaz de continue este bucle al igual que cualquier otra:

try: 
    yield int(item) 
    continue 
except (ValueError, TypeError) as WrongTypeError: 
    pass 

Como nota al margen, siempre he pensado continue era un nombre extraño para esta estructura de control ...

y, aquí está el código corregido en acción:

def type_convert(data): 
    for item in data: 
     try: 
      yield int(item) 
      continue 
     except (ValueError, TypeError) as WrongTypeError: 
      pass 
     try: 
      yield float(item) 
      continue 
     except (ValueError, TypeError) as WrongTypeError: 
      pass 
     yield item 


for a in type_convert(['a','1','1.0']): 
    print (a) 
4

no sé si lo hace la llamada siguiente() en cada uno de tratar de bloque, pero si esto es una preocupación de los años u, ¿por qué no lo haces

try: 
    item = int(item) 
except (ValueError, TypeError) as WrongTypeerror 
    try: 
     item = float(item) 
    except (ValueError, TypeError) as WrongTypeError 
     pass 
yield item 
0

Esto funciona:

def type_convert(data): 
    for item in data: 
     try: 
      yield int(item) 
      continue 
     except (ValueError, TypeError) as WrongTypeError: 
      pass 
     try: 
      yield float(item) 
      continue 
     except (ValueError, TypeError) as WrongTypeError: 
      pass 
     yield item 

Este es el resultado:

>>> list(type_convert(["13", 3.5, True])) 
[13, 3, 1] 
0

He aquí una respuesta generalizada:

def type_convert(*args): 
    datatypes = [] 
    for arg in args: 
     if type(arg) == type(type): 
      datatypes += [arg] 
     else: 
      data = arg 
    for item in data: 
     for datatype in datatypes: 
      try: 
       yield datatype(item) 
       break 
      except (ValueError, TypeError) as WrongTypeError: 
       pass 
     else: 
      yield item # unable to convert to any datatype 

for a in type_convert(int, float, ['a','1','1.0']): 
    print (a) 
Cuestiones relacionadas