日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python生成器(send,close,throw)方法详解

發(fā)布時間:2024/2/28 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python生成器(send,close,throw)方法详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

《Python生成器》一節(jié)中,詳細介紹了如何創(chuàng)建一個生成器,以及生成器的基礎用法。本節(jié)將在其基礎上,繼續(xù)講解和生成器有關的一些方法。

Python生成器send()方法

我們知道,通過調用 next() 或者 __next__() 方法,可以實現(xiàn)從外界控制生成器的執(zhí)行。除此之外,通過 send() 方法,還可以向生成器中傳值。

值得一提的是,send() 方法可帶一個參數(shù),也可以不帶任何參數(shù)(用 None 表示)。其中,當使用不帶參數(shù)的 send() 方法時,它和 next() 函數(shù)的功能完全相同。例如:

  • def intNum():
  • print("開始執(zhí)行")
  • for i in range(5):
  • yield i
  • print("繼續(xù)執(zhí)行")
  • num = intNum()
  • print(num.send(None))
  • print(num.send(None))
  • 程序執(zhí)行結果為:

    開始執(zhí)行
    0
    繼續(xù)執(zhí)行
    1

    注意,雖然 send(None) 的功能是 next() 完全相同,但更推薦使用 next(),不推薦使用 send(None)。

    這里重點講解一些帶參數(shù)的 send(value) 的用法,其具備 next() 函數(shù)的部分功能,即將暫停在 yield 語句出的程序繼續(xù)執(zhí)行,但與此同時,該函數(shù)還會將 value 值作為 yield 語句返回值賦值給接收者。

    注意,帶參數(shù)的 send(value) 無法啟動執(zhí)行生成器函數(shù)。也就是說,程序中第一次使用生成器調用 next() 或者 send() 函數(shù)時,不能使用帶參數(shù)的 send() 函數(shù)。

    舉個例子:

  • def foo():
  • bar_a = yield "hello"
  • bar_b = yield bar_a
  • yield bar_b
  • ?
  • f = foo()
  • print(f.send(None))
  • print(f.send("C語言中文網(wǎng)"))
  • print(f.send("http://c.biancheng.net"))
  • 分析一下此程序的執(zhí)行流程:
    1) 首先,構建生成器函數(shù),并利用器創(chuàng)建生成器(對象)f 。

    2) 使用生成器 f 調用無參的 send() 函數(shù),其功能和 next() 函數(shù)完全相同,因此開始執(zhí)行生成器函數(shù),即執(zhí)行到第一個 yield "hello" 語句,該語句會返回 "hello" 字符串,然后程序停止到此處(注意,此時還未執(zhí)行對 bar_a 的賦值操作)。

    3) 下面開始使用生成器 f 調用有參的 send() 函數(shù),首先它會將暫停的程序開啟,同時還會將其參數(shù)“C語言中文網(wǎng)”賦值給當前 yield 語句的接收者,也就是 bar_a 變量。程序一直執(zhí)行完 yield bar_a 再次暫停,因此會輸出“C語言中文網(wǎng)”。

    4) 最后依舊是調用有參的 send() 函數(shù),同樣它會啟動餐廳的程序,同時將參數(shù)“http://c.biancheng.net”傳給 bar_b,然后執(zhí)行完 yield bar_b 后(輸出 http://c.biancheng.net),程序執(zhí)行再次暫停。

    因此,該程序的執(zhí)行結果為:

    hello
    C語言中文網(wǎng)
    http://c.biancheng.net

    Python生成器close()方法

    當程序在生成器函數(shù)中遇到 yield 語句暫停運行時,此時如果調用 close() 方法,會阻止生成器函數(shù)繼續(xù)執(zhí)行,該函數(shù)會在程序停止運行的位置拋出 GeneratorExit 異常。

    舉個例子:

  • def foo():
  • try:
  • yield 1
  • except GeneratorExit:
  • print('捕獲到 GeneratorExit')
  • f = foo()
  • print(next(f))
  • f.close()
  • 程序執(zhí)行結果為:

    1
    捕獲到 GeneratorExit


    注意,雖然通過捕獲?GeneratorExit 異常,可以繼續(xù)執(zhí)行生成器函數(shù)中剩余的代碼,帶這部分代碼中不能再包含 yield 語句,否則程序會拋出 RuntimeError 異常。例如:

  • def foo():
  • try:
  • yield 1
  • except GeneratorExit:
  • print('捕獲到 GeneratorExit')
  • yield 2 #拋出 RuntimeError 異常
  • ?
  • f = foo()
  • print(next(f))
  • f.close()
  • 程序執(zhí)行結果為:

    1
    捕獲到 GeneratorExit Traceback (most recent call last):
    ? File "D:\python3.6\1.py", line 10, in <module>
    ??? f.close()
    RuntimeError: generator ignored GeneratorExit


    另外,生成器函數(shù)一旦使用 close() 函數(shù)停止運行,后續(xù)將無法再調用 next() 函數(shù)或者 __next__() 方法啟動執(zhí)行,否則會拋出 StopIteration 異常。例如:

  • def foo():
  • yield "c.biancheng.net"
  • print("生成器停止執(zhí)行")
  • ?
  • f = foo()
  • print(next(f)) #輸出 "c.biancheng.net"
  • f.close()
  • next(f) #原本應輸出"生成器停止執(zhí)行"
  • 程序執(zhí)行結果為:

    c.biancheng.net
    Traceback (most recent call last):
    ? File "D:\python3.6\1.py", line 8, in <module>
    ??? next(f) #原本應輸出"生成器停止執(zhí)行"
    StopIteration

    Python生成器throw()方法

    生成器 throw() 方法的功能是,在生成器函數(shù)執(zhí)行暫停處,拋出一個指定的異常,之后程序會繼續(xù)執(zhí)行生成器函數(shù)中后續(xù)的代碼,直到遇到下一個 yield 語句。需要注意的是,如果到剩余代碼執(zhí)行完畢沒有遇到下一個 yield 語句,則程序會拋出 StopIteration 異常。

    舉個例子:

  • def foo():
  • try:
  • yield 1
  • except ValueError:
  • print('捕獲到 ValueError')
  • ?
  • f = foo()
  • print(next(f))
  • f.throw(ValueError)
  • 程序執(zhí)行結果為:

    1
    捕獲到 ValueError
    Traceback (most recent call last):
    ? File "D:\python3.6\1.py", line 9, in <module>
    ??? f.throw(ValueError)
    StopIteration

    顯然,一開始生成器函數(shù)在 yield 1 處暫停執(zhí)行,當執(zhí)行 throw() 方法時,它會先拋出 ValueError 異常,然后繼續(xù)執(zhí)行后續(xù)代碼找到下一個 yield 語句,該程序中由于后續(xù)不再有 yield 語句,因此程序執(zhí)行到最后,會拋出一個 StopIteration 異常。

    總結

    以上是生活随笔為你收集整理的Python生成器(send,close,throw)方法详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 性欧美精品中出 | 中文国语毛片高清视频 | 激情六月综合 | 国产福利一区二区三区 | 国产伦精品一区二区三区四区免费 | 人妻一区二区三区视频 | 日韩一级片中文字幕 | 亚洲精品一区二区18漫画 | 亚洲啪啪网址 | 亚洲女同女同女同女同女同69 | 欧美做爰xxxⅹ性欧美大片 | av一二三四区 | 欧美精品欧美精品系列 | av手机版 | 骚虎视频最新网址 | 成人一级毛片 | 国产一区精品无码 | 免费人成又黄又爽又色 | 中文字幕免费在线观看 | 97视频久久| 亚洲国产成人91精品 | 九色91popny蝌蚪新疆 | 在线播放国产视频 | 五月天视频网站 | 国产精品久久久久av | 进去里视频在线观看 | 国产精品一区二区三区免费观看 | 中文字幕视频在线播放 | 久久久久久99精品久久久 | 穿情趣内衣被c到高潮视频 欧美性猛交xxxx黑人猛交 | 国产精品麻豆一区二区 | 日韩精彩视频在线观看 | 成年人网站在线观看视频 | 搞中出 | 国产在线观看免费高清 | 黄色成人在线 | 修女也疯狂3免费观看完整版 | 梦梦电影免费高清在线观看 | 少妇被中出 | 51精品 | 免费看亚洲 | 美女毛片网站 | 免播放器在线视频 | 国产伦理吴梦梦伦理 | 日韩人妻无码一区二区三区99 | 国产国语videosex另类 | 欧美日韩亚洲国产精品 | 婷婷激情五月网 | 日本在线中文字幕专区 | 国产成人精品影视 | 色香av| 久久亚洲无码视频 | 亚洲欧美韩日 | 永久黄网站 | 欧美激精品 | 欧美人妻少妇一区二区三区 | 国产99久久久久久免费看 | 国产精品日韩av | 9i在线看片成人免费 | 怡红院一区二区 | 波多野结衣办公室33分钟 | www超碰在线 | 久久久久久999| 艳妇臀荡乳欲伦交换h漫 | 少妇精品无码一区二区免费视频 | 蜜桃久久久久久 | 亚洲美女毛片 | 97超碰人人模人人人爽人人爱 | 村姑电影在线播放免费观看 | 国产精品视频免费在线观看 | 国产操比视频 | 蜜桃av免费看 | 日韩精品亚洲一区 | 中国一区二区视频 | 天天躁日日躁狠狠躁 | 欧美高清在线视频 | 国产乱淫av片杨贵妃 | 亚洲va国产va天堂va久久 | 亚洲一区二区三区影院 | 女人的天堂av | 亚洲天堂毛片 | 亚洲视频在线观看视频 | 香蕉视频亚洲 | 久久精视频 | 日韩精品一区二区三区在线视频 | 精品国产精品国产偷麻豆 | 日韩精品无码一区二区 | 伊人日韩| 男女啪啪无遮挡 | 一区二区精品在线 | 性生生活性生交a级 | 黄色小说在线观看视频 | 国产精品黄色大片 | 国产又粗又猛又爽又黄91精品 | 久久中出 | 国产精品丝袜黑色高跟鞋的设计特点 | 欧美在线观看视频一区 | 538国产视频 | 亚洲国产欧洲 |