2012-07-18 12 views
49

¿Cómo se puede pasar por un generador? Pensé de esta manera:Cómo pasar por un generador

gen = function_that_returns_a_generator(param1, param2) 
if gen: # in case the generator is null 
    while True: 
     try: 
      print gen.next() 
     except StopIteration: 
      break 

¿Hay una manera más pythonic?

+0

Yo sugeriría usar 'break'; not 'continue' –

+0

De hecho, lo haría de esta manera en el caso en que el generador arroje una excepción sobre un elemento, pero no desea detener la iteración. – robbrit

Respuesta

96

Simplemente

for x in gen: 
    # whatever 

hará el truco. Tenga en cuenta que if gen siempre devuelve True.

+5

No, 'if gen' no siempre devuelve' True'. Si el operador 'function_that_returns_a_generator()' devuelve 'None',' gen' se evalúa como 'False' en la sentencia' if'. – drevicko

+27

@drevicko: suponía que 'function_that_returns_a_generator()' devuelve un generador (supuesto en negrita, ¿no?). 'None' no es un generador. –

15
for item in function_that_returns_a_generator(param1, param2): 
    print item 

Usted no tiene que preocuparse acerca de la prueba para ver si hay algo de ser devuelto por la función como si no hay nada volvió no se entra en el bucle.

4

Justo lo tratan como cualquier otro iterable:

for val in function_that_returns_a_generator(p1, p2): 
    print val 

Tenga en cuenta que if gen: siempre será cierto, por lo que es una prueba falsa

0

Si desea mover manualmente a través del generador (es decir, para trabajar con cada bucle manualmente) entonces se podría hacer algo como esto:

from pdb import set_trace() 

    for x in gen: 
     set_trace() 
     #do whatever you want with x at the command prompt 
     #use pdb commands to step through each loop of the generator e.g., >>C#continue 
5

En caso de que no necesitan la salida del generador, ya que sólo se preocupan por su lado efectos, se puede utilizar el siguiente de una sola línea:

for _ in gen: pass 
3

Usted puede simplemente bucle a través de él:

>>> gen = (i for i in range(1, 4)) 
>>> for i in gen: print i 
1 
2 
3 

Pero tenga en cuenta, que sólo se puede bucle de una sola vez. La próxima vez que el generador estará vacío:

>>> for i in gen: print i 
>>> 
Cuestiones relacionadas