【问题标题】:Why do I need to store generator function to a variable first?为什么我需要先将生成器函数存储到变量中?
【发布时间】:2019-02-01 12:07:32
【问题描述】:

我正在探索在 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 个零?

【问题讨论】:

  • 因为你在每次迭代中都会创建新的generator 对象,一遍又一遍地获取第一个元素。
  • 谢谢,我明白了。我不知道对 fibonacci() 的第一次调用是初始化生成器对象。想知道为什么这个问题会得到如此多的负面回应,因为这对我来说并不那么明显。

标签: python generator yield


【解决方案1】:

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

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

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

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

【讨论】:

  • 更好的解决方案是将范围参数添加到fibonacci 本身并使用enumerate
  • @L3viathan 真的。该函数应在技术上控制迭代次数以避免此类伤亡。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多