Как перебрать генератор


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

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 55

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