Python 楊輝三角 生成器
阿新 • • 發佈:2018-11-21
# -*- coding: utf-8 -*- # 楊輝三角 """ 列表生成式直接佔用空間,generator一邊迴圈一邊計算的機制,儲存一個演算法,可以通過for迴圈迭代呼叫generator 不能使用列表生成式可以通過函式實現,含有yield關鍵字則為生成器 普通函式返回一個結果,按照順序執行 生成器函式返回的是一個生成器物件,每次呼叫next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。 不停呼叫next非常繁瑣並且沒有更多元素時會報錯,一次只返回一個物件,生成器正確用法是使用for迴圈迭代呼叫返回 """
def triangels(): ret = [1] while True: yield ret ret = [sum(i) for i in zip([0] + ret, ret + [0])] # ret = [x + y for (x, y) in zip([0] + ret, ret + [0])] # ret = [1] + [x+y for x,y in zip(ret[:-1],ret[1:])] + [1] """ 上面的公式一開始不太理解,後面轉化為下面的公式後比較一目瞭然, zip([0]+ret,ret+[0)]=zip([0]+[1],[1]+[0])=zip[(0,1),(1,0)] sum(i) 將兩個列表相同位置的元素相加得到新的列表最後變成[1,1] 我們可以再看下當ret = [1,1]之後公式是怎麼計算的,zip([0]+[1,1],[1,1]+[0])=zip[(0,1,1)+(1,1,0)] sum(i) 或者x + y=[1,2,1]以此類推 """ n = 0 results = [] for t in triangels(): print('T = ', t) results.append(t) print('Results = ', results) n = n + 1 if n == 10: break if results == [ [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] ]: print('測試通過!') else: print('測試失敗!')