2016-01-22 71 views
1

我是python的新手,我对其他代码的看法很差。 对于大多数人来说,一个愚蠢的问题,但我应该开始的地方。While循环Python斐波纳契

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

我不明白为什么要进入a, b = b, a+b 我看到和理解的结果,我可以断定的基本算法,但我不明白的是与这条线,以及为什么我们发生的真正理解需要它。

非常感谢

+1

你知道下面的答案是关于元组赋值/打包/解包的答案吗?如果是这样,并且你仍然不明白为什么你的代码能够正常工作,那么如果你尝试像Python解释器一样的行为,并且一步一步地通过你的代码,那么它可能会有所帮助。 –

+0

谢谢,我会牢记下我的下一个问题。这也是很好的知道这些东西被称为.. –

+0

了解。当你不知道事物的名字时,很难问正确的问题!一个好的教程应该告诉你事情的名字,但是我意识到,当你开始学习编码时,很难记住所有这些东西,而且很难知道什么信息对记忆很重要,什么是琐事。我所能建议的是继续学习你的书籍/教程,并使用示例代码进行演示,最终它将沉入其中。 –

回答

3

这条线按以下顺序执行:

  1. 新的元组与等于b和第二到a + b
  2. 元组是解包和第一元素是第一元素创建存储在a和第二个在b

tr icky的一部分是,首先执行正确的部分,你不需要使用临时变量。

2

您需要它的原因是,如果您使用新值更新a,您将无法计算出b的新值。在计算新值时,您总是可以使用临时变量来保留旧值,但这是避免这种情况的一种非常好的方法。

它被称为序列拆包。

在你的声明:

a, b = b, a + b 

右侧b, a + b创建tuple

>>> 8, 5 + 8 
(8, 13) 

你可以分配这个到左侧,这也是一个元组a, b

>>> a, b = 8, 13 
>>> a 
8 
>>> b 
13 

见最后一段上Tuples and Sequences的文档:

声明​​是元组封装的一个例子: '你好!' 的值12345,54321和在一个元组中包装在一起。反向操作也是可能的:

>>> x, y, z = t

这就是所谓的,非常合适,序列拆封并适用于在右侧的任意序列。序列解包要求左侧的变量列表与序列的长度具有相同数量的元素。请注意,多重赋值实际上只是元组打包和序列解包的组合。

+0

[Siftables TED talk](https://www.ted.com/talks/david_merrill_demos_siftables_the_smart_blocks)有一个在2分20秒生成斐波那契数列的好例子 –

+0

非常感谢!我现在明白了。这对我来说听起来很合乎逻辑。 –

+0

@AlexNewmiller很棒。感谢您的反馈。 –