【问题标题】:Understanding yield in python [duplicate]了解python中的产量[重复]
【发布时间】:2014-03-08 13:56:07
【问题描述】:

我是 Python 业余爱好者,正在尝试编写代码来生成斐波那契数列,但遇到了一个奇怪的行为。

>>> def F(num):                    #line1
    a,b = 1,2                      #line2                      
    yield a                        #line3
    yield b                        #line4
    while num>2:                   #line5
        a,b = b,a+b                #line6
        yield b                    #line7


>>> gen = F(10)                    #line8
>>>                                #line9

代码中的while 循环是一个无限循环。我的问题是,如果循环没有结束,那么#line8 是如何完成执行的?

谢谢!!

【问题讨论】:

  • 你知道yield 做什么以及生成器是如何工作的吗?

标签: python python-2.7


【解决方案1】:

这是对yield 的误解。 Python 使用所谓的惰性求值。它不是提前计算所有“产量”,而是到达第一个并停止,然后仅返回一个迭代器。如果你从控制台调用F(10),你会看到一个迭代器对象。

当您开始迭代列表时,例如通过编写[x for x in F(10)],Python 会一遍又一遍地执行循环。

如果这令人困惑,请将yield b 替换为return b。现在循环不再是无限的了,是吗?

【讨论】:

  • 循环需要减量操作才能有限...但是我理解 line8 执行的原因!感谢您的信息!
【解决方案2】:

while 循环不会结束,因为您正在检查的变量在其中永远不会改变。如果您每次在循环内 yield 后实际递减 num 变量,则循环将是有限的。

另外,一旦函数被解析,循环就不会被执行,它会在第 8 行调用函数之后执行。

如果您尝试对函数产生的可迭代对象进行实际迭代,可能会更清楚发生了什么:

for i in F(10)
    print i

结果应该是这样的:

1
2
3
5 
... and so on forever

【讨论】:

    【解决方案3】:

    我不能投票,但 Asad 是正确的。仅仅因为你定义了一个函数并不意味着它很兴奋。假设您将其作为脚本运行,在到达第 8 行之前不会实际执行任何代码。

    【讨论】:

      猜你喜欢
      • 2013-04-11
      • 2017-11-19
      • 1970-01-01
      • 2017-12-01
      • 2017-05-18
      • 1970-01-01
      • 2013-03-24
      相关资源
      最近更新 更多