发电机可以多次使用吗?

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两次,第二次将失败,如你所料.


hir*_*ist 6

不,你不能迭代生成器两次。一旦你迭代了一个生成器,它就会耗尽。您可以使用以下方法制作生成器的副本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) 的回答