1. 程式人生 > >Python 楊輝三角 生成器

Python 楊輝三角 生成器

# -*- 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('測試失敗!')