Python Fibonacci生成器序列

时间:2018-04-18 08:08:10

标签: python fibonacci yield

我目前正在研究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. 在第一次迭代中,是否只返回一个初始值的返回值?是否完全停止了收益?

  2. 在第二次迭代中,它在哪里得到1?如果a,b = b,那么a + b将是1 + 1,那么为什么第二个值不是2?

  3. 我也不确定1的相同值是如何返回两次。

  4. 总结一下,我想知道输出的每一行的具体操作是什么。我似乎无法将这一部分直接放在脑海中。让我重申,我已经看了很多不同的地方,但我看到的并没有帮助过。

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

如果您遵循此逻辑,您将理解为什么该代码的行为方式。