Python - 斐波那契数

0 投票
4 回答
781 浏览
提问于 2025-04-18 02:04
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

这段话的意思是,和基本的交换方法很像,实际上就像在做以下操作:

tmp = b
b = a + b
a = tmp
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

现在利用这个特性,可以生成斐波那契数列。

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

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
6

在Python中,b, a = a + b, b 这行代码会自动先创建一个中间的元组,然后再把新值赋给变量。

把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

撰写回答