发电机一旦使用过一次,就无法再次使用。为什么是这样?
考虑以下代码:
def generator(n):
a = 1
for _ in range(n):
yield a
a += 1
def run_generator(generator):
for a in generator:
print(a, end = " ")
Run Code Online (Sandbox Code Playgroud)
如果我要执行这个:
count_generator = generator(10)
run_generator(count_generator)
run_generator(count_generator)
Run Code Online (Sandbox Code Playgroud)
它只会打印:
1 2 3 4 5 6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)
基本上,生成器在执行一次后就会死亡。
我知道生成器只能使用一次这一事实是 Python 内置的东西,但为什么会这样呢?是否有特定原因只允许生成器对象执行一次?
发电机的工作原理就像自动收报机磁带。当您拨打next
它时,它会为您提供下一个号码,但随后它会忘记它,这与列表不同。这就是大部分效率的来源。由于它不必记住以前的值是什么,因此内存占用要小得多(特别是当最终不需要它的所有值时!)
有些生成器也许可以重置以便能够再次运行,但这绝不是保证的,如果您尝试这样做,有些生成器将彻底失败。Python 不是一种纯语言,因此您可能拥有在生成值时修改状态的生成器。例如,一个生成器,例如:
def gimme_randoms():
while True:
yield random.random()
Run Code Online (Sandbox Code Playgroud)
我可以称之为一堆,但random
每次我这样做时,PRNG 背后的状态都会改变。
rs = gimme_randoms()
a = next(rs)
b = next(rs)
c = next(rs) # some numbers
Run Code Online (Sandbox Code Playgroud)
重置此状态意味着什么?那么你会期望:
rs2 = gimme_randoms()
x = next(rs2)
y = next(rs2)
z = next(rs2)
assert a == x and b == y and c == z # Nonsense!
Run Code Online (Sandbox Code Playgroud)
为了保持这种状态,您必须跟踪 PRNG 的初始状态,然后找到一种方法将其种子设置回初始状态。这当然是可行的,但生成器的工作不是了解其底层实现如何修改状态。