2016-01-22 38 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很棒。感謝您的反饋。 –