Python生成器和列表生成式
阿新 • • 發佈:2019-01-11
生成器:
在Python中, 這種一邊迴圈一邊計算的機制, 稱為生成器:generator
列表生成式:L(list) = [x * x for x in range(10)]
生成器: g(generator) = (x * x for x in range(10))
義
generator
的
另
一種方法。 如果一個函式定
義
中包含
yield
關
鍵
字, 那麼
這
個函式就不再是一個普通函式, 而是一個
generator
。
在Python中, 這種一邊迴圈一邊計算的機制, 稱為生成器:generator
列表生成式:L(list) = [x * x for x in range(10)]
生成器: g(generator) = (x * x for x in range(10))
呼叫該generator時, 首先要生成一個generator物件, 然後用 next() 函式不斷獲得下一個返回值
斐波拉契數列函式:
斐波拉契數列generator:def fib(max): n, a, b = 0, 0, 1 while n < max: print(b) a , b = b, a + b n = n + 1 return 'done'
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
這
就是定這裡, 最難理解的就是generator和函式的執行流程不一樣。 函式是順序執行, 遇到 return 語句或者最後一行函式語句就返回。 而變成generator的函式, 在每次調用 next() 的時候執行, 遇到 yield 語句返回, 再次執行時從上次返回的 yield 語句處繼續執行。
楊輝三角函式:
def triangles(): n = 1 N = [1] while True: print(N) N.append(0) N = [N[i-1] + N[i] for i in range(len(N))] n = n + 1 if n >10: break
結果:
>>>>triangles()
[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]
楊輝三角generator函式:
def triangles():
p = [1]
while True:
yield p
p = [1] + [p[i] + p[i+1] for i in range(len(p)-1)] + [1]