標籤:程式設計語言 Python
# 這是學習廖雪峰老師python教程的學習筆記
1、概覽
列表元素按照某種演算法推算出來,在迴圈的過程中不斷推算出後續的元素。這種一邊迴圈一邊計算的機制,稱為產生器:generator
1.1、建立 generator
1)方法一
只要把一個列表產生式的[]改成(),就建立了一個generator
L = [x * x for x in range(10)] # 這是列表產生式
g = (x * x for x in range(10)) # 這是generator
>>> g
<generator object <genexpr> at 0x1022ef630>
generator的值不能直接列印,需要用 next()函數獲得,或者通過for迴圈列印
每調用一次,返回一個generator的值,當所有值返回完畢後,再調用會報錯StopIteration
>>> for n in g:
... print(n)
2)方法二
在函數體中,有 yield。當然,generator的函數,也可以用 next() 或者 for 迴圈擷取傳回值
函數是順序執行,遇到return語句或者最後一行函數語句就返回
generator的函數,在每次調用next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行
def odd():
print('step 1')
yield 1
print('step 2')
yield(3)
print('step 3')
yield(5)
>>> o = odd()
>>> next(o) # next(odd()) 調用效果一樣。for迴圈調用見例題
step 1
1
>>> next(o)
step 2
3
>>> next(o)
step 3
5
2、例題
1、編寫一個產生斐波那契數列的 generator 函數
# 函數編寫
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
# for迴圈擷取傳回值,但擷取不到generator 執行完的報錯返回
f=fib(6) # 定義一個generator對象 f
for n in f:
print(n)
# 擷取值得同時,擷取generator的報錯返回
g=fib(6)
while True:
try:
x=next(g)
print('g',x)
except StopIteration as e: # 捕捉錯誤
print('Generator return value:',e.value) # 輸入錯誤的傳回值
break
2、編寫一個楊輝三角的generator函數
# -*- coding: utf-8 -*-
def triangles():
N=[1]
while True:
yield N #generator函數與普通函數的差別:在執行過程中,遇到yield就中斷,下次又繼續執行
N.append(0)
N=[N[i-1] + N[i] for i in range(len(N))] #楊輝三角的產生式
if __name__ == '__main__': # 如果是啟動並執行.py檔案,就執行下面的命令。調試用
n=0
for t in triangles():
print(t)
n=n+1
if n == 10:
break
Python學習筆記__3.4章 產生器