如何循环生成器

iTa*_*ayb 68 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
Run Code Online (Sandbox Code Playgroud)

有更多的pythonic方式吗?

Sve*_*ach 125

只是

for x in gen:
    # whatever
Run Code Online (Sandbox Code Playgroud)

会做的.请注意,if gen始终返回True.

  • @drevicko:我假设`function_that_returns_a_generator()`返回一个生成器(粗体假设,不是吗?).`None`不是发电机. (40认同)
  • 不,`如果gen`并不总是返回'True`.如果op的`function_that_returns_a_generator()`返回`None`,`gen`在`if`语句中求值为'False`. (5认同)

Chr*_*tts 15

for item in function_that_returns_a_generator(param1, param2):
    print item
Run Code Online (Sandbox Code Playgroud)

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


mmj*_*mmj 9

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

for _ in gen: pass
Run Code Online (Sandbox Code Playgroud)

  • 或者只是`list(gen)` (7认同)
  • 元组或列表将存储所有结果。如果生成器要循环数十亿次(有些会无限循环),这并不酷。 (2认同)

ada*_*tpl 7

您可以简单地循环遍历它:

>>> gen = (i for i in range(1, 4))
>>> for i in gen: print i
1
2
3
Run Code Online (Sandbox Code Playgroud)

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

>>> for i in gen: print i
>>> 
Run Code Online (Sandbox Code Playgroud)


cry*_*ick 6

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

x = list(generator)
Run Code Online (Sandbox Code Playgroud)

对于简单的预处理,请使用列表推导式:

x = [tup[0] for tup in generator]
Run Code Online (Sandbox Code Playgroud)

如果你只想执行生成器而不保存结果,你可以跳过变量赋值:

# no var assignment b/c we don't need what print() returns
[print(_) for _ in gen]
Run Code Online (Sandbox Code Playgroud)

如果您的生成器是无限的(例如,从互联网流式传输项目),请不要这样做。列表构造是一个阻塞操作,在生成器为空之前不会停止。