我是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
我看到和理解的结果,我可以断定的基本算法,但我不明白的是与这条线,以及为什么我们发生的真正理解需要它。
非常感谢
我是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
我看到和理解的结果,我可以断定的基本算法,但我不明白的是与这条线,以及为什么我们发生的真正理解需要它。
非常感谢
这条线按以下顺序执行:
b
和第二到a + b
a
和第二个在b
tr icky的一部分是,首先执行正确的部分,你不需要使用临时变量。
您需要它的原因是,如果您使用新值更新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
这就是所谓的,非常合适,序列拆封并适用于在右侧的任意序列。序列解包要求左侧的变量列表与序列的长度具有相同数量的元素。请注意,多重赋值实际上只是元组打包和序列解包的组合。
[Siftables TED talk](https://www.ted.com/talks/david_merrill_demos_siftables_the_smart_blocks)有一个在2分20秒生成斐波那契数列的好例子 –
非常感谢!我现在明白了。这对我来说听起来很合乎逻辑。 –
@AlexNewmiller很棒。感谢您的反馈。 –
你知道下面的答案是关于元组赋值/打包/解包的答案吗?如果是这样,并且你仍然不明白为什么你的代码能够正常工作,那么如果你尝试像Python解释器一样的行为,并且一步一步地通过你的代码,那么它可能会有所帮助。 –
谢谢,我会牢记下我的下一个问题。这也是很好的知道这些东西被称为.. –
了解。当你不知道事物的名字时,很难问正确的问题!一个好的教程应该告诉你事情的名字,但是我意识到,当你开始学习编码时,很难记住所有这些东西,而且很难知道什么信息对记忆很重要,什么是琐事。我所能建议的是继续学习你的书籍/教程,并使用示例代码进行演示,最终它将沉入其中。 –