【问题标题】:Python Fibonacci series - different while loopsPython Fibonacci 系列 - 不同的 while 循环
【发布时间】:2018-06-03 03:57:02
【问题描述】:

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

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

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

第二个 while 循环显然做对了。我猜这与交换值时分配变量的方式有关。

造成这种差异的原因是什么?

感谢您的意见和帮助,

第一个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

【问题讨论】:

  • 逐行运行(或添加更多打印语句) - 您很快就会看到发生了什么。
  • x 在计算y 的新值之前被修改。
  • 谢谢,好建议

标签: python loops while-loop fibonacci


【解决方案1】:

并行作业

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)

右边的元组在赋值之前就已经完全定义好了。

连续分配

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

【讨论】:

  • 感谢 Eric 的快速回复。一个后续查询 - 在同一行(并行分配)中编写代码如何不允许立即分配。这就是编码标准的构建方式吗?
  • @user9020348:这是期望的行为,例如切换两个变量。如果你想立即分配,你可以写x = y; y= x而不是x, y = y, x
  • 实际上,写像a, b = b, a 这样的东西并不是两个单独的任务。右值 (b, a) 构建了一个由两个值组成的 tuple,并且该元组在任何赋值发生之前完全构建。然后将元组分配给另一个元组,该元组由两个变量组成,因此它被解包,并且每个变量都从最近构建的元组中获得一个元素。然后元组又被遗忘了。
【解决方案2】:

编辑答案:

没有问题。按照你的第一个循环的顺序,所以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。我的计算机科学课教授告诉我,在纸上逐行遵循代码有助于理解计算机遵循的过程。我还发现帮助培养阅读代码的能力是件好事。希望这会有所帮助。

【讨论】:

  • 是的,已经尝试过了。但仍会感谢您的意见。
猜你喜欢
  • 2023-03-10
  • 2014-11-02
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多