首頁>Club>
def triangles(): b = [1] while True: yield b b = [1] + [b[i] + b[i+1] for i in range(len(b)-1)] + [1] n = 0 for t in triangles(): print(t) n = n + 1 if n == 10: break #b = [1] + [b[i] + b[i+1] for i in range(len(b)-1)] + [1]
13
回覆列表
  • 1 # matplotlib小講堂

    在讀程式碼前我們首先需要知道什麼是楊輝三角以及楊輝三角有什麼特性。

    楊輝三角

    楊輝三角中國南宋數學家楊輝1261年所著的《詳解九章演算法》一書裡提到的二項式係數在三角形中的一種幾何排列。

    在每行端點與結尾的數為1的前提下,楊輝三角有以下基本特性:每個數等於它上方兩數之和。每行數字左右對稱,由1開始逐漸變大。第n行的數字有n項。第n行數字和為2n-1。程式碼解讀

    此程式碼可分為兩部分,第一部分為triangles函式,第二部分為for迴圈輸出,而難點就在於第一部分triangles函式。

    我們可以看出,triangles函式並沒有return,但是第二部分的for迴圈中卻用triangles()當做迭代物件,其實這是函式中yield b產生的作用。

    yield 關鍵字在函數里相當於return的作用,但是它返回的是一個可迭代物件。當呼叫函式的時候它返回一個值,然後執行函式中的迴圈指向下一個值繼續等待呼叫,而下一次呼叫開始前,函式內的迴圈絕不會往下繼續進行。

    為了更好的理解yield的作用,我們首先需要了解一下迭代器和生成器。

    利用迭代器可以我們快速建立一個列表列表,如myList = [ i for i in range(10) ],但是當資料非常大而這個列表又只需要用一次的時候,使用迭代器建立的列表會佔用大量的記憶體。

    此時我們可以使用一種特殊的迭代器——生成器,它的形式與迭代器很像,就是把中括號換成小括號,如myGenerator=( i for i in range(10) ),生成器與迭代器相比它的好處在於它不會佔用大量記憶體,因為它是閱後即焚的。

    當我們有一個函式要生成大量只讀取一次的資料時,這個函式與迭代器一樣會浪費大量的記憶體,而透過yield的方法將資料返回,則可以像生成器一樣,不佔用大量記憶體。

    程式碼執行過程

    n = 0, for t in triangles()執行triangles()函式中的第一次迴圈,此時b= [1] ,返回[1],然後繼續執行b = [1] + [b[i] + b[i+1] for i in range(len(b)-1)] + [1],由於len(b)-1=0,所以b = [1, 1]

    n = 1,執行triangles()函式中的第二次迴圈,此時b = [1, 1],返回[1, 1],然後繼續執行b = [1] + [b[i] + b[i+1] for i in range(len(b)-1)] + [1],b = [1, 2, 1]依次類推,一直執行到 n+1 = 10時,跳出迴圈

  • 中秋節和大豐收的關聯?
  • 張傑《my sunshine》歌詞?