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

时间:2019-02-01 12:07:33

标签: python generator yield

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

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

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个零?

1 个答案:

答案 0 :(得分:3)

如克里斯在评论中所说:

  

因为那样,您将在每次迭代中创建新的生成器对象,一遍又一遍地获取第一个元素。

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

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