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
这段话的意思是,和基本的交换方法很像,实际上就像在做以下操作:
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
现在利用这个特性,可以生成斐波那契数列。
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