【问题标题】:Regarding the Fibonacci Sequence example in Python's function tutorial关于Python函数教程中的斐波那契数列示例
【发布时间】:2013-03-09 02:20:00
【问题描述】:

这是they 拥有的:

def fib(n):
    a, b = 0, 1
    while a < n:
        print a,
        a, b = b, a+b

这就是我所拥有的:

def fib(n):
    a = 0
    b = 1
    while a < n:
        print a
        a = b
        b = b+a

第一个在使用时返回正确的序列,而我的继续 0、1、2、4、8、16、32...

我目前正在学习编程(之前没有接受过计算机科学教育),很明显问题在于我如何定义变量。用逗号分隔变量和用新行分隔变量有什么区别(假设这是问题所在)?

【问题讨论】:

    标签: python fibonacci


    【解决方案1】:

    只有一个区别:

    在第一个中,b = b+a的赋值是在a的修改之前完成的。这是因为,在完成任何赋值之前,首先计算 RHS 中的表达式。

    而在第二个中,第二个赋值是在修改a之后完成的。这就是您看到错误结果的原因。

    所以,在你的代码中:

    b = b + a
    

    其实是:

    b = b + b
    

    因为a 已经被分配了b 的值。

    【讨论】:

    • 对不起,但这对我来说并不直观,但那是因为我仍在努力理解语法本身。看第一个例子,如何首先分配 b = b + a ?我尝试在我的代码中交换 a = b 和 b = b + a 的位置,但它对输出没有影响。编辑:虽然我看到我的 order 变量分配顺序是错误的,但我也按该顺序阅读了教程。因为看起来 a 是先重新分配给我的。
    【解决方案2】:

    这是一个元组赋值:

    a, b = 0, 1
    

    你也可以认为是

    (a, b) = (0, 1)
    

    使用值0 和1 创建一个临时元组,然后解压到变量a 和b 上

    这也是一个元组赋值

    a, b = b, a+b
    

    同样,您可以将其视为

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

    临时元组是根据b 和a+b 的值创建的在它们中的任何一个被更新之前。分配仅发生在 临时元组创建之后。

    通过将其分解为单独的步骤,您正在改变代码的含义。

    让我们看看这里发生了什么

    a, b = 0, 1        # a=0 , b=1
    a, b = b, a+b      # a=1 , b=1
    

    比较

    a = 0              # a=0
    b = 1              # a=0 , b=1
    a = b              # a=1 , b=1
    b = b+a            # a=1 , b=2 
    

    【讨论】:

    • 这正是我需要知道的(还不熟悉元组赋值的原理)。谢谢。
    猜你喜欢
    • 2022-01-14
    • 2013-08-03
    • 2013-02-24
    • 1970-01-01
    • 2017-07-08
    • 2014-05-03
    • 2014-05-23
    • 2015-06-05
    相关资源
    最近更新 更多