Python生成器generator用法示例
本文實例分析了Python生成器generator用法。分享給大家供大家參考,具體如下:
生成器generator本質(zhì)是一個函數(shù),它記住上一次在函數(shù)體中的位置,在生成器函數(shù)下一次調(diào)用,會自動找到該位置,局部變量都保持不變
l = [x * 2 for x in range(10)] # 列表生成式 g = (x * 2 for x in range(10)) print(l,g) # l打印的是一個列表,g則是一個generator的內(nèi)存地址
一次性打印獲取generator的所有元素:
for index in g: print(index)
逐步獲取generator的元素:
print(g.__next__()) # 0 print(g.__next__()) # 2 print(g.__next__()) # 4 print(g.__next__()) # 6 print(g.__next__()) # 8
yield關(guān)鍵字
通常我們做一個打印0-50的數(shù)時,會定義一個函數(shù),只要調(diào)用這個函數(shù),它就會自定打印0-50的數(shù)
def fib(num): n = 0 while n < num: print(n) n+=1 fib(50)
其實我們只需要改動那么一丟丟,就可以將上面那個函數(shù)改變成一個generator
def fib(num): n = 0 while n < num: yield n # 在使用yield關(guān)鍵字時,需在前面先定義一個變量n n+=1 g = fib(50) # 此時的g是一個generator
generator原理:通過某一種特定的算法,在一個特定的條件下,不斷向下推算,得出后續(xù)的元素。因為generator不必創(chuàng)建list,所以可以大大的節(jié)約內(nèi)存空間。舉個栗子:
def fib(): print("step 1") yield 1 print("step 2") yield 2 print("step 3") yield 3 g = fib() g.__next__() # 結(jié)果:step 1 g.__next__() # 結(jié)果:step 2 g.__next__() # 結(jié)果:step 3
根據(jù)結(jié)果可以看出,每次執(zhí)行next()
,都會打印一句,而遇到yield
就直接跳出,并記錄位置,再次執(zhí)行next()
時,會從記錄的那個位置開始往下執(zhí)行,再次遇到yield
時跳出。
此時我們不經(jīng)會想,如果我們不斷的調(diào)用next()
,該如何判斷是否已經(jīng)完畢,如果越界了,是否會報錯?
# -* coding:utf-8 -*- #! python3 ''' Created on 2018年8月10日 @author: Administrator ''' def fib(num): n = 0 while n < num : yield n n+=1 g = fib(10) while True: print(g.__next__())
執(zhí)行結(jié)果:
可以看出當(dāng)遍歷完畢之后,如果在此調(diào)用next()
將會報錯,我們是無法獲取到遍歷的下標(biāo)的,那么我們該如何規(guī)避這個錯誤呢?對next()
拋異常處理
def fib(num): n = 0 while n < num : yield n n+=1 g = fib(10) while True: try: print(g.__next__()) except StopIteration: print("已經(jīng)完畢") break
此時將不再報錯,當(dāng)越界的時候,系統(tǒng)會自動捕捉該異常,并且打印你想要輸出的信息
send方法
在單線程下實現(xiàn)一個簡單的并行效果
# -*- coding:utf-8 -*- #! python3 ''' Created on 2018年8月10日 @author: Administrator ''' import time def startEat(name): print("%s準(zhǔn)備開始吃包子了"%name) while True: b = yield print("%s被%s吃了"%(b,name)) def startMake(): laowang = startEat("laowang") laowang.__next__() for index in range(10): time.sleep(1) print("已經(jīng)做好了包子%d號"%index) laowang.send("包子%d號"%index) startMake()
執(zhí)行結(jié)果:
更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python列表(list)操作技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設(shè)計有所幫助。
相關(guān)文章
解決ImportError: cannot import name ‘Imput
您遇到的ImportError: cannot import name ‘Imputer‘錯誤提示表明您嘗試導(dǎo)入一個名為’Imputer’的模塊或類,但是該模塊或類無法找到,本文小編給大家介紹了如何解決這個問題,需要的朋友可以參考下2023-10-10安裝Keras,tensorflow,并實現(xiàn)將虛擬環(huán)境添加到j(luò)upyter?notebook
這篇文章主要介紹了安裝Keras,tensorflow,并實現(xiàn)將虛擬環(huán)境添加到j(luò)upyter?notebook,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03python爬蟲入門教程--利用requests構(gòu)建知乎API(三)
這篇文章主要給大家介紹了關(guān)于python爬蟲入門之利用requests構(gòu)建知乎API的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-05-05python 地圖經(jīng)緯度轉(zhuǎn)換、糾偏的實例代碼
這篇文章主要介紹了python 地圖經(jīng)緯度轉(zhuǎn)換、糾偏的實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-08-08Python函數(shù)中參數(shù)是傳遞值還是引用詳解
這篇文章主要介紹了深入了解Python函數(shù)中參數(shù)是傳值還是傳引用,在 C/C++ 中,傳值和傳引用是函數(shù)參數(shù)傳遞的兩種方式,在Python中參數(shù)是如何傳遞的,需要的朋友可以參考下2019-07-07