Has*_*Doe 11 python generator yield-keyword
这是我的一段代码,定义了两个生成器:
one_line_gen = (x for x in range(3))
def three_line_gen():
yield 0
yield 1
yield 2
Run Code Online (Sandbox Code Playgroud)
当我执行:
for x in one_line_gen:
print x
for x in one_line_gen:
print x
Run Code Online (Sandbox Code Playgroud)
结果如预期:
0
1
2
Run Code Online (Sandbox Code Playgroud)
但是,如果我执行:
for x in three_line_gen():
print x
for x in three_line_gen():
print x
Run Code Online (Sandbox Code Playgroud)
结果是:
0
1
2
0
1
2
Run Code Online (Sandbox Code Playgroud)
为什么?我以为任何发电机只能使用一次.
Ofe*_*dan 13
three_line_gen它不是一个发电机,它是一个功能.当你打电话给它时它返回的是一个发电机,每次调用它时都是一个全新的发电机.每次你把这样的括号:
three_line_gen()
Run Code Online (Sandbox Code Playgroud)
它是一个可以迭代的全新生成器.但是如果你是第一个做的话
mygen = three_line_gen()
Run Code Online (Sandbox Code Playgroud)
并迭代mygen两次,第二次将失败,如你所料.
不,你不能迭代生成器两次。一旦你迭代了一个生成器,它就会耗尽。您可以使用以下方法制作生成器的副本tee:
from itertools import tee
one_line_gen = (x for x in range(3))
gen1, gen2 = tee(one_line_gen)
# or:
# gen1, gen2 = tee(x for x in range(3))
for item in gen1:
print(item)
for item in gen2:
print(item)
Run Code Online (Sandbox Code Playgroud)
对于其他问题,请参阅奥弗·萨丹 (Ofer Sadan) 的回答。
| 归档时间: |
|
| 查看次数: |
2785 次 |
| 最近记录: |