Python Fibonacci系列 - 不同的while循环

问题描述 投票:1回答:2

我对Python比较陌生,所以请原谅我的无知。

用于生成Fib系列的这两个while循环实现导致非常不同的输出。

第一个是返回2的幂级数,虽然我觉得它应该完全与后者相同;这是返回预期的系列。

第二个while循环显然正在做正确的事情。我猜它与交换值时分配变量的方式有关。

是什么推动了这种差异?

感谢您的投入和帮助,

第一次循环:

def fib(n):
x=0 
y=1
while y < n:
    print(y)
    x = y
    y = x + y

第二个while循环:

x,y=0,1
while y < 100:
    print(y)
    x,y = y,x+y
python loops while-loop fibonacci
2个回答
0
投票

编辑答案:

没问题。按照你的第一个循环的顺序,所以x=0, y=1。循环中的第一行使x = y = 1

所以现在y=1

然后,你的下一行创建y=x+y。这意味着y=1+1=2。现在x=1y=2

对于下一次迭代:

x = y = 2

所以x = 2

然后:

y= 2 + 2 = 4

如上所述,您的第二个循环是并行分配。所以遵循从x=0y=1开始的逻辑:

x,y=y,x+y

原因:

x=1 and y= 0+1 = 1 simultaneously

所以现在x=1y=1。然后进行下一次迭代:

x=1 and y= 1+1=2 simultaneously

所以现在x=1y=2。我的计算机科学课的教授告诉我,在纸上逐行编写代码有助于理解计算机遵循的过程。我还发现帮助构建读取代码的能力是很好的。希望这有帮助。


3
投票

Parallel assignments

x,y = y,x+y

这是一个并行分配。右侧的x仍旧是旧的x,尚未设置为y。这是期望的行为,例如为了交换两个变量而不需要第三个变量:

>>> a = 1
>>> b = 2
>>> a, b = b, a
>>> a
2
>>> b
1

正如@Alfe所解释的那样,x, y = y, x + y实际上是一个单元组赋值:

(x, y) = (y, x + y)

在赋值发生之前,右边的元组是完全定义的。

Successive assignments

x = y
y = x + y

第二行右侧的x在前一行设置为y,因此第二行实际上是y = y + y

如果您尝试以这种方式交换两个变量,您将获得两次相同的值:

>>> a = 1
>>> b = 2
>>> a = b
>>> b = a
>>> a
2
>>> b
2

你需要第三个变量:

>>> a = 1
>>> b = 2
>>> temp = b
>>> b = a
>>> a = temp
>>> a
2
>>> b
1
© www.soinside.com 2019 - 2024. All rights reserved.