Python 生成器,迭代,yield關鍵字,send()傳參給yield語句操作示例
本文實例講述了Python 生成器,迭代,yield關鍵字,send()傳參給yield語句操作。分享給大家供大家參考,具體如下:
demo.py(生成器,yield關鍵字):
# 生成器是一個特殊的迭代器??梢杂胒or...in遍歷。 # 帶有yield關鍵字的函數(shù),不再是一個函數(shù),而是一個生成器模板。調用該模板會返回一個生成器對象。 def create_num(all_num): a, b = 0, 1 current_num = 0 while current_num < all_num: yield a # 當遍歷create_num返回的生成器時,會阻塞在yield的位置。每次遍歷出的值都是yield后的值。 a, b = b, a+b current_num += 1 # return '返回值' # 迭代結束后,繼續(xù)調用next會拋StopIteration異常。 可以通過該異常來獲取該返回值。 (異常.value 就是該返回值) # create_num"函數(shù)"中有一個yield,那么create_num不再是一個函數(shù)。調用時,會返回一個生成器對象。 obj = create_num(10) # 只會返回一個生成器對象(可用于遍歷)。并不會執(zhí)行create_num中的代碼,只有遍歷(迭代)時才會執(zhí)行create_num中的代碼。 ret = next(obj) # 迭代的本質就是調用對象的__next__函數(shù)。 會返回yield后面的值,并阻塞代碼,直到再次調用next(或迭代)才會解阻塞。 print(ret) # 當create_num中的代碼執(zhí)行完后,迭代就會結束。 ret = next(obj) # 如果迭代結束后,繼續(xù)調用next,那么會拋異常。 可以通過異常來獲取create_num return的值。 print(ret) # 可以通過異常來判斷是否迭代結束。 obj2 = create_num(2) # obj2和obj的遍歷迭代互不影響。 ret = next(obj2) print(ret) # for num in obj: # print(num)
運行結果:
0
1
0
demo.py(通過異常判斷迭代是否結束):
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...." # 通過迭代結束后的異常來獲取該返回值 obj = create_num(10) # 返回一個生成器對象。并不會執(zhí)行create_num中的代碼,只有遍歷迭代obj時才會執(zhí)行create_num中的代碼 while True: try: ret = next(obj) # 迭代結束后繼續(xù)調用next會拋異常。 print(ret) except Exception as ret: print(ret.value) # 通過異常獲取create_num return的值。 break
運行結果:
0
1
1
2
3
5
8
13
21
34
ok....
demo.py(send()迭代生成器,傳參給yield語句):
def create_num(all_num): a, b = 0, 1 current_num = 0 while current_num < all_num: ret = yield a # send的參數(shù)就是yield語句的返回值。 print(">>>ret>>>>", ret) # hahahha a, b = b, a+b current_num += 1 obj = create_num(10) # obj.send(None) # send一般不會放到第一次啟動(迭代)生成器,如果非要這樣做 那么傳遞None (否則會拋異常) ret = next(obj) # 第一次遍歷迭代生成器時,建議使用next函數(shù)。 print(ret) # send與next作用相同,都是進行下一次迭代的意思。 (都會解阻塞yield關鍵字) # send可以傳遞參數(shù)表示yield語句的返回值。 而next不能傳遞參數(shù)。 ret = obj.send("hahahha") # 會先將"hahahha"參數(shù)當做yield語句的返回值,然后再解阻塞yield 遍歷。(因此不推薦第一次遍歷時使用send傳參) print(ret)
運行結果:
0
>>>ret>>>> hahahha
1
創(chuàng)建生成器的簡單方式:
更多關于Python相關內容可查看本站專題:《Python數(shù)據(jù)結構與算法教程》、《Python Socket編程技巧總結》、《Python函數(shù)使用技巧總結》、《Python字符串操作技巧匯總》及《Python入門與進階經(jīng)典教程》
希望本文所述對大家Python程序設計有所幫助。
相關文章
Python3使用Matplotlib 繪制精美的數(shù)學函數(shù)圖形
這篇文章主要介紹了Python3使用Matplotlib 繪制精美的數(shù)學函數(shù)圖形,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-04-04pytorch之torch_scatter.scatter_max()用法
這篇文章主要介紹了pytorch之torch_scatter.scatter_max()用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09跟老齊學Python之集成開發(fā)環(huán)境(IDE)
IDE的全稱是:Integrated Development Environment,簡稱IDE,也稱為Integration Design Environment、Integration Debugging Environment,翻譯成中文叫做“集成開發(fā)環(huán)境”,在臺灣那邊叫做“整合開發(fā)環(huán)境”。2014-09-09Python2.7實現(xiàn)多進程下開發(fā)多線程示例
這篇文章主要為大家詳細介紹了Python2.7實現(xiàn)多進程下開發(fā)多線程示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05python實現(xiàn)點擊按鈕修改數(shù)據(jù)的方法
今天小編就為大家分享一篇python實現(xiàn)點擊按鈕修改數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07使用Python手工計算x的算數(shù)平方根,來自中國古人的數(shù)學智慧
本篇采用的計算方法既非二分法也非牛頓迭代法,而是把中國古代的手工計算平方根的方法轉成代碼來完成。代碼有點煩雜,算是拋磚引玉吧,期待高手們寫出更好的代碼來2021-09-09