Python Fibonacci序列和序列解包

时间:2015-03-03 16:10:51

标签: python-2.7

我通过迭代处理斐波那契序列。我期望以下两个函数提供相同的结果,但它们没有。

示例1(根据需要返回Fibonacci序列):

def run():
    for x in range(0,20):    
        fib(x)

def fib(n):
    a, b = 0, 1
    for i in range(n):
        a, b = b, a + b
    print a

run() 

示例1结果:

0
1
1
2
3
5
8
13
21
34

示例2(没有序列解包):

def run():
    for x in range(0,20):    
        fib(x)

def fib(n):
    a = 0
    b = 1
    for i in range(n):
        a = b
        b = a + b 
    print a

run() 

示例2结果:

0
1
2
4
8
16
32
64
128
256

具体来说,为什么......

a, b = b, a + b

不同于......

a = b
b = a + b

2 个答案:

答案 0 :(得分:0)

a, b = b, a + b首先评估=的右侧,然后将其分配到左侧。即ab中的结果将基于先前值的计算(在此行之前)。虽然第二个代码完全按顺序执行,但第二行使用第一行中获得的值进行评估。

答案 1 :(得分:0)

第一个返回右手值(a + b)的评估结果并将其用于分配。也就是说,评估(a + b)和THEN赋值(a = b)和(b =结果) 而第二个覆盖" a"在它可用于你的等式之前。

即循环使用以下内容:

a=b
b=a+b

结果是:

a = 0, b = (0 + 1), print a: 0
a = 1, b = (1 + 1), print a: 1
a = 2, b = (2 + 2), print a: 2
a = 4, b = (4 + 4), print a: 4

您需要的是临时返回值,因为在评估语句a + b之前,您不想更新a或b的值。

def fib(n):
    a = 0
    b = 1
    for i in range(n):
        temp = a + b
        a, b = b, temp
    print a