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