2012-07-18 6 views
49

Wie kann man einen Generator durchschleifen? Ich dachte über diesen Weg nach:Wie man einen Generator durchläuft

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 

Gibt es einen mehr pythonischen Weg?

+0

Ich würde vorschlagen, 'break' zu verwenden; nicht "continue" –

+0

Ich würde es tatsächlich so machen, wenn der Generator eine Ausnahme auf ein Element werfen könnte, aber Sie wollen die Iteration nicht stoppen. – robbrit

Antwort

96

einfach

for x in gen: 
    # whatever 

den Trick. Beachten Sie, dass if gen immer True zurückgibt.

+5

Nein, 'wenn gen' nicht immer' True' zurückgibt. Wenn die Funktion 'function_that_returns_a_generator() 'des Operators' None' zurückgibt, wird 'gen' in der' if' -Anweisung zu 'False' ausgewertet. – drevicko

+27

@drevicko: Ich ging davon aus, dass 'function_that_returns_a_generator()' einen Generator zurückgibt (fette Annahme, nicht wahr?). 'None' ist kein Generator. –

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

Sie brauchen nicht über den Test zur Sorge gibt, um zu sehen, ob etwas von Ihrer Funktion zurückgegeben wird, als ob es nichts zurückgegeben werden Sie nicht die Schleife ein.

4

einfach behandeln sie wie jede andere iterable:

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

Beachten Sie, dass if gen: wird immer wahr sein, so dass es ein falscher Test ist

0

Wenn Sie manuell wollen den Generator bewegen sich durch (dh arbeiten manuell mit jeder Schleife), dann könnte man so etwas tun:

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

Falls Sie den Ausgang des Generators nicht brauchen, weil Sie nur über die Seite kümmern

for _ in gen: pass 
3

Sie können einfach durch Schleife: Effekte, können Sie die folgenden Einzeiler verwenden

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

aber darüber im Klaren sein, dass Sie nur eine Zeitschleife. Der nächste Zeitgenerator ist leer:

>>> for i in gen: print i 
>>> 
Verwandte Themen