Jak jedna pętla może przejść przez generator? Myślałem o tym w ten sposób:
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
Czy jest bardziej pytoniczny sposób?
break
; niecontinue
Odpowiedzi:
Po prostu
for x in gen: # whatever
da rade. Zauważ, że
if gen
zawsze zwracaTrue
.źródło
if gen
nie zawsze wracaTrue
. Jeśli PO zafunction_that_returns_a_generator()
zwrotówNone
,gen
ocenia sięFalse
wif
oświadczeniu.function_that_returns_a_generator()
zwraca generator (odważne założenie, prawda?).None
nie jest generatorem.for item in function_that_returns_a_generator(param1, param2): print item
Nie musisz martwić się testem, aby sprawdzić, czy funkcja zwraca coś, tak jakby nic nie zostało zwrócone, nie wejdziesz do pętli.
źródło
W przypadku, gdy nie potrzebujesz wyjścia generatora, ponieważ zależy Ci tylko na jego skutkach ubocznych, możesz użyć następującego jednoliniowca:
for _ in gen: pass
źródło
list(gen)
Możesz po prostu zapętlić to:
>>> gen = (i for i in range(1, 4)) >>> for i in gen: print i 1 2 3
Pamiętaj jednak, że pętlę można wykonać tylko raz. Następnym razem generator będzie pusty:
>>> for i in gen: print i >>>
źródło
Po prostu potraktuj to jak każdą inną iterowalną:
for val in function_that_returns_a_generator(p1, p2): print val
Zauważ, że
if gen:
zawsze będzie True, więc jest to fałszywy testźródło
Jeśli chcesz ręcznie poruszać się po generatorze (tj. Ręcznie pracować z każdą pętlą), możesz zrobić coś takiego:
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
źródło
Pozostałe odpowiedzi są dobre w przypadku skomplikowanych scenariuszy. Jeśli chcesz po prostu przesłać elementy do listy:
x = list(generator)
(lub, jeśli chcesz po prostu uruchomić generator, aby coś zrobił, po prostu
list(generator)
.Do prostego przetwarzania wstępnego użyj wyrażeń listowych:
x = [tup[0] for tup in generator]
Lub gdy chcesz wykonać proste funkcje:
# didn't assign to variable b/c we don't care about what the print() function returns [print(x) for x in gen]
źródło