Подтвердить что ты не робот

Как петля через генератор

Как можно пропустить генератор? Я подумал об этом:

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

Есть ли более питонический путь?

4b9b3361

Ответ 1

Просто

for x in gen:
    # whatever

сделает трюк. Обратите внимание, что if gen всегда возвращает True.

Ответ 2

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

Вам не нужно беспокоиться о тесте, чтобы узнать, есть ли что-либо, возвращаемое вашей функцией, как будто ничего не вернулось, вы не войдете в цикл.

Ответ 3

Просто относитесь к нему как к любому другому итерабельному:

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

Обратите внимание, что if gen: всегда будет True, поэтому это ложный тест

Ответ 4

Если вам не нужен выход генератора, потому что вы заботитесь только о его побочных эффектах, вы можете использовать следующий однострочный:

for _ in gen: pass

Ответ 5

Вы можете просто пропустить его:

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

Но имейте в виду, что вы можете зацикливаться только один раз. Следующий генератор времени будет пустым:

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

Ответ 6

Если вы хотите вручную переместить генератор (т.е. работать с каждым циклом вручную), вы можете сделать что-то вроде этого:

    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