Как перебрать генератор
как можно сделать петлю через генератор? Я думал об этом так:
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
есть ли более подходящие для Python способ?
6 ответов:
просто
for x in gen: # whatever
будет делать трюк. Обратите внимание, что
if gen
всегда возвращаетTrue
.
for item in function_that_returns_a_generator(param1, param2): print item
вам не нужно беспокоиться о тест, чтобы увидеть, если есть что-то возвращает ваша функция, как будто ничего не возвращается вы не войдете в цикл.
в случае, если вам не нужен выход генератора, потому что вы заботитесь только о его побочных эффектах, вы можете использовать следующий one-liner:
for _ in gen: pass
просто относитесь к нему как к любому другому итерируемому:
for val in function_that_returns_a_generator(p1, p2): print val
отметим, что
if gen:
всегда будет true, так что это ложный тест
Вы можете просто пройти через него:
>>> gen = (i for i in range(1, 4)) >>> for i in gen: print i 1 2 3
но имейте в виду, что вы можете только цикл один раз. В следующий раз генератор будет пуст:
>>> for i in gen: print i >>>
Если вы хотите вручную перемещаться через генератор (т. е. работать с каждым циклом вручную), то вы можете сделать что-то вроде этого:
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