【Python】生成器和楊輝三角

減不下來不改名發表於2017-11-13

生成器

在python中,一邊迴圈一邊計算的機制,稱為生成器(generator)。generator儲存的是演算法,它也是可迭代物件。
建立generator:
方法一:將一個列表生成式的[]改成()。
方法二:將print(b)改為yield b。
執行過程:
generator和函式的執行流程不一樣。函式是順序執行,遇到return語句或者最後一行函式語句就返回。而變成generator的函式,在每次呼叫next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。利用for迴圈來迭代列印。

練習:楊輝三角

把每一行看做一個list,試寫一個generator,不斷輸出下一行的list:

# 期待輸出:
# [1]
# [1, 1]
# [1, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]
# [1, 5, 10, 10, 5, 1]
# [1, 6, 15, 20, 15, 6, 1]
# [1, 7, 21, 35, 35, 21, 7, 1]
# [1, 8, 28, 56, 70, 56, 28, 8, 1]
# [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
n = 0
for t in triangles():
    print(t)
    n = n + 1
    if n == 10:
        break

以下程式碼是”@其實我姓謝“同學的。
程式碼如下:

def triangles():
    L = [1]     
    while True:
        yield L
        L.append(0)
        L = [L[i-1]+L[i] for i in range(len(L))]
n=0
a = input("請輸入楊輝三角的行數:")
for t in triangles():
    print(t)
    n = n+1
    if n == int(a):
        break

【分析】

L = [1]每一行第一個元素都是1。
進入迴圈。
列印L。
對與N行來說,只要知道N-1行,就可以得出N行的元素,因為每一行的元素都由上一行的元素的左右元素相加得到的,然而N行的最後一個元素由N-1的最後一個元素再加0得到的,因為N-1少一個元素,所以就是新增0的作用。
此行是關鍵,range(len(L))得到的使0到x-1的數,len(L)計算該L有幾個元素,L[i-1]+L[i],使得相鄰的兩個元素相加,以次列印出來。

相關文章