Python 生成器,迭代,yield關(guān)鍵字,send()傳參給yield語(yǔ)句操作示例
本文實(shí)例講述了Python 生成器,迭代,yield關(guān)鍵字,send()傳參給yield語(yǔ)句操作。分享給大家供大家參考,具體如下:
demo.py(生成器,yield關(guān)鍵字):
# 生成器是一個(gè)特殊的迭代器。可以用for...in遍歷。
# 帶有yield關(guān)鍵字的函數(shù),不再是一個(gè)函數(shù),而是一個(gè)生成器模板。調(diào)用該模板會(huì)返回一個(gè)生成器對(duì)象。
def create_num(all_num):
a, b = 0, 1
current_num = 0
while current_num < all_num:
yield a # 當(dāng)遍歷create_num返回的生成器時(shí),會(huì)阻塞在yield的位置。每次遍歷出的值都是yield后的值。
a, b = b, a+b
current_num += 1
# return '返回值' # 迭代結(jié)束后,繼續(xù)調(diào)用next會(huì)拋StopIteration異常。 可以通過(guò)該異常來(lái)獲取該返回值。 (異常.value 就是該返回值)
# create_num"函數(shù)"中有一個(gè)yield,那么create_num不再是一個(gè)函數(shù)。調(diào)用時(shí),會(huì)返回一個(gè)生成器對(duì)象。
obj = create_num(10) # 只會(huì)返回一個(gè)生成器對(duì)象(可用于遍歷)。并不會(huì)執(zhí)行create_num中的代碼,只有遍歷(迭代)時(shí)才會(huì)執(zhí)行create_num中的代碼。
ret = next(obj) # 迭代的本質(zhì)就是調(diào)用對(duì)象的__next__函數(shù)。 會(huì)返回yield后面的值,并阻塞代碼,直到再次調(diào)用next(或迭代)才會(huì)解阻塞。
print(ret) # 當(dāng)create_num中的代碼執(zhí)行完后,迭代就會(huì)結(jié)束。
ret = next(obj) # 如果迭代結(jié)束后,繼續(xù)調(diào)用next,那么會(huì)拋異常。 可以通過(guò)異常來(lái)獲取create_num return的值。
print(ret) # 可以通過(guò)異常來(lái)判斷是否迭代結(jié)束。
obj2 = create_num(2) # obj2和obj的遍歷迭代互不影響。
ret = next(obj2)
print(ret)
# for num in obj:
# print(num)
運(yùn)行結(jié)果:
0
1
0
demo.py(通過(guò)異常判斷迭代是否結(jié)束):
def create_num(all_num):
a, b = 0, 1
current_num = 0
while current_num < all_num:
yield a
a, b = b, a+b
current_num += 1
return "ok...." # 通過(guò)迭代結(jié)束后的異常來(lái)獲取該返回值
obj = create_num(10) # 返回一個(gè)生成器對(duì)象。并不會(huì)執(zhí)行create_num中的代碼,只有遍歷迭代obj時(shí)才會(huì)執(zhí)行create_num中的代碼
while True:
try:
ret = next(obj) # 迭代結(jié)束后繼續(xù)調(diào)用next會(huì)拋異常。
print(ret)
except Exception as ret:
print(ret.value) # 通過(guò)異常獲取create_num return的值。
break
運(yùn)行結(jié)果:
0
1
1
2
3
5
8
13
21
34
ok....
demo.py(send()迭代生成器,傳參給yield語(yǔ)句):
def create_num(all_num):
a, b = 0, 1
current_num = 0
while current_num < all_num:
ret = yield a # send的參數(shù)就是yield語(yǔ)句的返回值。
print(">>>ret>>>>", ret) # hahahha
a, b = b, a+b
current_num += 1
obj = create_num(10)
# obj.send(None) # send一般不會(huì)放到第一次啟動(dòng)(迭代)生成器,如果非要這樣做 那么傳遞None (否則會(huì)拋異常)
ret = next(obj) # 第一次遍歷迭代生成器時(shí),建議使用next函數(shù)。
print(ret)
# send與next作用相同,都是進(jìn)行下一次迭代的意思。 (都會(huì)解阻塞yield關(guān)鍵字)
# send可以傳遞參數(shù)表示yield語(yǔ)句的返回值。 而next不能傳遞參數(shù)。
ret = obj.send("hahahha") # 會(huì)先將"hahahha"參數(shù)當(dāng)做yield語(yǔ)句的返回值,然后再解阻塞yield 遍歷。(因此不推薦第一次遍歷時(shí)使用send傳參)
print(ret)
運(yùn)行結(jié)果:
0
>>>ret>>>> hahahha
1
創(chuàng)建生成器的簡(jiǎn)單方式:

更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python實(shí)現(xiàn)讀取csv文件并進(jìn)行排序
這篇文章主要為大家詳細(xì)介紹了一個(gè)python簡(jiǎn)單案例并進(jìn)行代碼展示,本文的案例是利用pandas庫(kù)實(shí)現(xiàn)讀取csv文件并按照列的從小到大進(jìn)行排序,需要的可以參考一下2023-02-02
Python3使用Matplotlib 繪制精美的數(shù)學(xué)函數(shù)圖形
這篇文章主要介紹了Python3使用Matplotlib 繪制精美的數(shù)學(xué)函數(shù)圖形,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
pytorch之torch_scatter.scatter_max()用法
這篇文章主要介紹了pytorch之torch_scatter.scatter_max()用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
跟老齊學(xué)Python之集成開(kāi)發(fā)環(huán)境(IDE)
IDE的全稱是:Integrated Development Environment,簡(jiǎn)稱IDE,也稱為Integration Design Environment、Integration Debugging Environment,翻譯成中文叫做“集成開(kāi)發(fā)環(huán)境”,在臺(tái)灣那邊叫做“整合開(kāi)發(fā)環(huán)境”。2014-09-09
Python2.7實(shí)現(xiàn)多進(jìn)程下開(kāi)發(fā)多線程示例
這篇文章主要為大家詳細(xì)介紹了Python2.7實(shí)現(xiàn)多進(jìn)程下開(kāi)發(fā)多線程示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
python實(shí)現(xiàn)點(diǎn)擊按鈕修改數(shù)據(jù)的方法
今天小編就為大家分享一篇python實(shí)現(xiàn)點(diǎn)擊按鈕修改數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
在pytorch中計(jì)算準(zhǔn)確率,召回率和F1值的操作
這篇文章主要介紹了在pytorch中計(jì)算準(zhǔn)確率,召回率和F1值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
使用Python手工計(jì)算x的算數(shù)平方根,來(lái)自中國(guó)古人的數(shù)學(xué)智慧
本篇采用的計(jì)算方法既非二分法也非牛頓迭代法,而是把中國(guó)古代的手工計(jì)算平方根的方法轉(zhuǎn)成代碼來(lái)完成。代碼有點(diǎn)煩雜,算是拋磚引玉吧,期待高手們寫出更好的代碼來(lái)2021-09-09

