Python - 斐波纳契数

时间:2014-04-09 17:08:31

标签: python

def fibonacci(x):
    a=0
    b=1
    for i in range(x-1):
        b, a = a+b, b
    return b
 x = input ("Give me the number! ")
 print "The",x,". Fibonacci number: "
 print fibonacci (x)

所以代码完全正常,但我不明白,b,a=a+b,b行,那么这是做什么的?:S

4 个答案:

答案 0 :(得分:6)

在python中,b, a = a + b, b在将新值分配给变量之前自动存储中间tuple

分解Python的指令,b, a = a + b, b正在执行此反汇编:

  5          17 LOAD_FAST                1 (b)
             20 LOAD_FAST                0 (a)
             23 LOAD_FAST                1 (b)
             26 BINARY_ADD
             27 ROT_TWO
             28 STORE_FAST               0 (a)
             31 STORE_FAST               1 (b)

从更简单的意义上讲,这是一个过程:

temp_tuple = (a + b, a)
b, a = temp_tuple

这个答案是从我的另一个答案的一部分复制而来的:https://stackoverflow.com/a/21585974/3130539

答案 1 :(得分:1)

Python支持多种不同形式的多重赋值。特别是,

>>> a = b = c = 1
>>> a
1
>>> b
1
>>> c
1

>>> a, b, c, *the_rest = list(range(10))
>>> a
0
>>> b
1
>>> c
2
>>> the_rest
[3, 4, 5, 6, 7, 8, 9]

所以你所拥有的相当于:

tmp = b
b = a+b
a = tmp

答案 2 :(得分:0)

与基本交换习语类似,它基本上就像执行以下操作:

tmp = b
b = a + b
a = tmp

答案 3 :(得分:0)

Python将右侧表达式与左侧赋值分开。首先评估右侧,并将结果存储在堆栈中,然后使用从堆栈中重新获取值的操作码分配左侧名称。

>>> import dis
>>> def foo(a, b):
...     a, b = b, a
... 
>>> dis.dis(foo)
  2           0 LOAD_FAST                1 (b)
              3 LOAD_FAST                0 (a)
              6 ROT_TWO             
              7 STORE_FAST               0 (a)
             10 STORE_FAST               1 (b)
             13 LOAD_CONST               0 (None)
             16 RETURN_VALUE        

它的工作方式与其他任何拆包工作类似。

首先,创建由b和a的值组成的元组。然后将这个元组解压缩到a和b中,有效地交换它们。

>>> a=5
>>> b=6
>>> a,b = b,a
>>> a
6
>>> b
5

现在使用此属性,将生成Fibonacci序列。

来源:https://stackoverflow.com/a/21047622/1112163