本文實例分析了Python生成器generator用法。分享給大家供大家參考,具體如下:
生成器generator本質是一個函數,它記住上一次在函數體中的位置,在生成器函數下一次調用,會自動找到該位置,局部變量都保持不變
l = [x * 2 for x in range(10)] # 列表生成式g = (x * 2 for x in range(10))print(l,g) # l打印的是一個列表,g則是一個generator的內存地址
一次性打印獲取generator的所有元素:
for index in g: print(index)
逐步獲取generator的元素:
print(g.__next__()) # 0print(g.__next__()) # 2print(g.__next__()) # 4print(g.__next__()) # 6print(g.__next__()) # 8
yield關鍵字
通常我們做一個打印0-50的數時,會定義一個函數,只要調用這個函數,它就會自定打印0-50的數
def fib(num): n = 0 while n < num: print(n) n+=1fib(50)
其實我們只需要改動那么一丟丟,就可以將上面那個函數改變成一個generator
def fib(num): n = 0 while n < num: yield n # 在使用yield關鍵字時,需在前面先定義一個變量n n+=1g = fib(50) # 此時的g是一個generator
generator原理:通過某一種特定的算法,在一個特定的條件下,不斷向下推算,得出后續的元素。因為generator不必創建list,所以可以大大的節約內存空間。舉個栗子:
def fib(): print("step 1") yield 1 print("step 2") yield 2 print("step 3") yield 3g = fib()g.__next__() # 結果:step 1g.__next__() # 結果:step 2g.__next__() # 結果:step 3
根據結果可以看出,每次執行next()
,都會打印一句,而遇到yield
就直接跳出,并記錄位置,再次執行next()
時,會從記錄的那個位置開始往下執行,再次遇到yield
時跳出。
此時我們不經會想,如果我們不斷的調用next()
,該如何判斷是否已經完畢,如果越界了,是否會報錯?
# -* coding:utf-8 -*-#! python3'''Created on 2018年8月10日@author: Administrator'''def fib(num): n = 0 while n < num : yield n n+=1g = fib(10)while True: print(g.__next__())
執行結果:
可以看出當遍歷完畢之后,如果在此調用next()
將會報錯,我們是無法獲取到遍歷的下標的,那么我們該如何規避這個錯誤呢?對next()
拋異常處理
def fib(num): n = 0 while n < num : yield n n+=1g = fib(10)while True: try: print(g.__next__()) except StopIteration: print("已經完畢") break
此時將不再報錯,當越界的時候,系統會自動捕捉該異常,并且打印你想要輸出的信息
新聞熱點
疑難解答