如何循环生成器

时间:2012-07-18 10:21:47

标签: python generator

如何循环通过发电机?我这么想:

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

有更多的pythonic方式吗?

7 个答案:

答案 0 :(得分:119)

简单地

for x in gen:
    # whatever

会做到这一点。请注意,if gen始终返回True

答案 1 :(得分:15)

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

您无需担心测试,看看您的函数是否返回任何内容,就好像没有任何返回,您将无法进入循环。

答案 2 :(得分:7)

如果您不需要生成器的输出,因为您只关心它的副作用,您可以使用以下单行:

for _ in gen: pass

答案 3 :(得分:4)

就像任何其他可迭代一样对待它:

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

请注意,if gen:始终为True,因此这是一个错误的测试

答案 4 :(得分:3)

你可以简单地遍历它:

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

但要注意,你只能循环一次。下次生成器将为空:

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

答案 5 :(得分:1)

如果你想手动移动生成器(即手动处理每个循环),你可以这样做:

    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   

答案 6 :(得分:1)

其他答案适用于复杂的情况。如果您只想将项目流式传输到列表中:

x = list(generator)

(或者,如果您只想触发生成器执行操作,只需list(generator)

要进行简单的预处理,请使用列表推导:

x = [tup[0] for tup in generator]

或者当您想执行简单功能时:

# didn't assign to variable b/c we don't care about what the print() function returns
[print(x) for x in gen]