生成器的另一個示例,這個生成器功能是從大小生,生成斐波那契數列
def fib(max): # 定義一個函式fib,引數為max a, b = 0, 1 # 初始化兩個變數a和b,分別賦值為0和1 n = 0 # 初始化計數變數n為0 while b < max: # 當b小於max時繼續迴圈 print(b) # 列印當前的斐波那契數列值b a, b = b, a + b # 更新a和b的值,使其依次向前推算斐波那契數列 n += 1 # 計數變數n加1 print('done') # 迴圈結束後列印'done' fib(100) # 呼叫fib函式,設定max為100
現在只需要在上面程式碼第五行,,print(b) 這一句改為 yield b 可以變為生成器生成 ,改變性存 # 使用yield關鍵字返回當前的斐波那契數列值,改成生成器後 在列印這個fib(100)時,只會返回結果,如果需要呼叫每一句值,就需要用到__next__()
def fib(max): # 定義一個生成器函式fib,引數為max a, b = 0, 1 # 初始化兩個變數a和b,分別賦值為0和1 while b < max: # 當b小於max時繼續迴圈 yield b # 使用yield關鍵字返回當前的斐波那契數列值b a, b = b, a + b # 更新a和b的值,使其依次向前推算斐波那契數列 return 'done' # 迴圈結束後返回'done' # 呼叫生成器函式並遍歷輸出結果 for num in fib(100): # 呼叫fib函式並傳入max為100 print(num) # 列印每個斐波那契數列值
##呼叫生成器的元素
f = fib(100) print(f._next__())
##利用迴圈一次調取生成器的結果可以用for
for i in f:
print(i)
但是利用for 列印不會列印迴圈後的語句,print(done)估記不線上程內,如果迴圈10次,調第十一次的時候內部有拋異常,只有抓住異常才會顯示如果要在生成器中列印出 "done" 語句,可以在生成器結束後迭代生成器物件。在迭代過程中,當生成器丟擲 StopIteration 異常時,我們可以捕獲該異常並在異常處理中新增列印 "done" 的操作。
def fib(max): # 定義一個生成器函式fib,引數為max a, b = 0, 1 # 初始化兩個變數a和b,分別賦值為0和1 while b < max: # 當b小於max時繼續迴圈 yield b # 使用yield關鍵字返回當前的斐波那契數列值b a, b = b, a + b # 更新a和b的值,使其依次向前推算斐波那契數列 raise StopIteration('done') # 丟擲StopIteration異常,並附帶提示資訊 'done' # 呼叫生成器函式並遍歷輸出結果 gen = fib(100) # 呼叫fib函式並傳入max為100 try: while True: num = next(gen) # 獲取生成器的下一個值 print(num) # 列印每個斐波那契數列值 except StopIteration as e: print(e) # 列印異常中的提示資訊 'done'