我目前正在研究Python,并且已经变得有点卡在Fibonacci数字生成器上。经过几个小时的研究,我没有取得多大进展。我在一定程度上理解了输出,在我知道每次迭代发生了什么之前,我感觉不太愿意转向另一个主题。
def fibonacci_generator() :
a , b = 0 , 1
while True :
yield a
a , b = b , a + b
fib = fibonacci_generator()
for i in fib :
if i > 100 :
break
else :
print( 'Generated:' , i )
运行此代码后,我看到以下输出。
Generated: 0
Generated: 1
Generated: 1
Generated: 2
Generated: 3
Generated: 5
Generated: 8
Generated: 13
Generated: 21
Generated: 34
Generated: 55
Generated: 89
根据Stack Overflow上类似问题的几个答案,我明白第一次调用生成器时,a和be分别初始化为0和1,然后是yield语句的值(a = 0 )返回给调用者。
为了节省一点时间并使事情变得清晰,有几个问题。
在第一次迭代中,是否只返回一个初始值的返回值?是否完全停止了收益?
在第二次迭代中,它在哪里得到1?如果a,b = b,那么a + b将是1 + 1,那么为什么第二个值不是2?
我也不确定1的相同值是如何返回两次。
总结一下,我想知道输出的每一行的具体操作是什么。我似乎无法将这一部分直接放在脑海中。让我重申,我已经看了很多不同的地方,但我看到的并没有帮助过。
答案 0 :(得分:1)
为了给出背景,fibonacci_generator是一个生成器函数,它返回一个生成器,它实际上只是一个迭代器对象。
在第一次迭代中,生成器产生一个,然后它停在那里直到你再次调用它。再次调用它后,它会重新计算a和b,因为它是True,所以会循环进入,并产生重新计算的a。它只是不断重复这个过程。
第二和第三个问题:
每当你有一个赋值语句时,在赋值语句的右边完成之前,左边的变量都不会被赋值。
因此,
a, b = b, a + b
a
时, b
不等于a + b
,但它与原来的相等。换句话说,a, b = b, a + b
相当于:
temp = a
a = b
b = temp + b
如果您遵循此逻辑,您将理解为什么该代码的行为方式。