理解python中的yield

时间:2014-03-08 05:37:43

标签: python python-2.7

我是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如何完成执行?

谢谢!

3 个答案:

答案 0 :(得分:1)

这是对yield的误解。 Python使用可称为延迟评估的东西。它不是预先计算所有“产量”,而是先到达第一个并停止,然后只返回一个迭代器。如果你从控制台调用F(10),你会看到一个迭代器对象。

当你开始迭代列表时,例如通过编写[x for x in F(10)],Python将反复执行循环。

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

答案 1 :(得分:0)

while循环不会结束,因为您正在检查的变量永远不会在其中发生变化。如果你在循环中每次产生后实际递减num变量,那么循环将是有限的。

此外,解析函数后不执行循环,在第8行调用函数后执行循环。

如果您尝试实际迭代函数生成的迭代,那么正在发生的事情会更清楚:

for i in F(10)
    print i

结果应如下所示:

1
2
3
5 
... and so on forever

答案 2 :(得分:-1)

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