我是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
如何完成执行?
谢谢!
答案 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行之前,实际上不会执行任何代码。