【问题标题】:Python - fibonacci numbers [duplicate]Python - 斐波那契数
【发布时间】:2014-05-23 01:22:54
【问题描述】:
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

【问题讨论】:

标签: python


【解决方案1】:

在 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
  • 感谢您贡献引擎盖下发生的事情!
【解决方案2】:

类似于基本的交换习语,基本上就像在做以下事情:

tmp = b
b = a + b
a = tmp

【讨论】:

    【解决方案3】:

    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
    

    【讨论】:

      【解决方案4】:

      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

      【讨论】:

      猜你喜欢
      • 2013-08-03
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 2014-05-03
      • 1970-01-01
      相关资源
      最近更新 更多