2012-07-18 16 views
49

Come si può effettuare un loop su un generatore? Ho pensato in questo modo:Come effettuare il looping di un generatore

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 

Esiste un modo più pitonioso?

+0

Suggerirei di usare 'break'; non 'continue' –

+0

Effettivamente lo farei in questo modo nel caso in cui il generatore possa generare un'eccezione su un elemento, ma non si desidera interrompere l'iterazione. – robbrit

risposta

96

Semplicemente

for x in gen: 
    # whatever 

farà il trucco. Si noti che if gen restituisce sempre True.

+5

No, 'se gen' non restituisce sempre' True'. Se l'opzione 'function_that_returns_a_generator()' restituisce 'None',' gen' restituisce 'False' nell'istruzione' if'. – drevicko

+27

@drevicko: stavo dando per scontato che 'function_that_returns_a_generator()' restituisca un generatore (ipotesi in grassetto, no?). 'Nessuno' non è un generatore. –

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

Non è necessario preoccuparsi di prova per vedere se c'è qualcosa di essere restituito dalla funzione, come se non c'è niente restituito non entrerete il ciclo.

4

Proprio trattarlo come qualsiasi altro iterabile:

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

noti che if gen: sarà sempre vero, quindi è una falsa prova

0

Se si desidera spostare manualmente attraverso il generatore (vale a dire, a lavorare ad ogni ciclo manualmente) allora si potrebbe fare qualcosa di simile:

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

Nel caso in cui non hanno bisogno l'uscita del generatore perché si interessa soltanto il suo lato effetti, è possibile utilizzare il seguente one-liner:

for _ in gen: pass 
3

Si può semplicemente ciclo attraverso di essa:

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

Ma essere consapevoli, che si può solo ciclo una volta. La prossima volta che il generatore sarà vuoto:

>>> for i in gen: print i 
>>>