如何循环通过发电机?我这样想过:
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
.
Chr*_*tts 15
for item in function_that_returns_a_generator(param1, param2):
print item
Run Code Online (Sandbox Code Playgroud)
您无需担心测试,看看您的函数是否返回任何内容,就好像没有任何返回,您将无法进入循环.
如果您不需要生成器的输出,因为您只关心它的副作用,您可以使用以下单行:
for _ in gen: pass
Run Code Online (Sandbox Code Playgroud)
您可以简单地循环遍历它:
>>> 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)
其他答案适用于复杂的场景。如果您只想将项目流式传输到列表中:
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)
如果您的生成器是无限的(例如,从互联网流式传输项目),请不要这样做。列表构造是一个阻塞操作,在生成器为空之前不会停止。