如何循环通过发电机?我这么想:
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方式吗?
答案 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]