为什么我需要先将生成器函数存储到一个变量中?

Why do I need to store generator function to a variable first?

我正在探索 python 中生成器的使用,但我 运行 遇到了一个奇怪的问题。

以下代码如何按预期工作(例如,每次调用函数时 returns 下一个斐波那契数):

def fibonacci():                                       
    current, previous = 0,1                             
    while True:                                         
        yield current
        current, previous = current + previous, current

fib = fibonacci()

for i in range(0,21):
    print(next(fib))

但是当我直接在 for 循环中调用函数时,像这样:

for i in range(0,21):
    print(next(fibonacci()))

它打印出 21 个零?

正如克里斯在评论中所说:

Because then you are making new generator object in every iteration, getting first element over and over.

可以避免通过直接迭代将其分配给变量。这样你只创建一个生成器对象:

for n, i in zip(fibonacci(), range(0,21)):
    print(n)