摘要:本文主要通過代碼示例詳解yield和生成器、yield 對象、yield from 、next()和send()的區別。
一、yield和生成器
1.yield只能在函數中使用,yield一次返回一個結果。
2.當函數中包含yield時,在調用的時候不會馬上執行,而是返回一個生成器。
3.每次訪問生成器實時生成一個成員,不保留結果和狀態,因此當所有成員訪問結束時,再次訪問將拋出異常。
二、yield對象
python中一切都是對象,因此yield生成器、函數等等本質都是yield對象。
三、 yield from的使用
yield from 後面需跟一個迭代器。
等同於以下代碼:
四、next()和send()的區別。
python中兩者均可以訪問生成器,但區別很大。
next()可以指定默認的返回值,這樣生成器在stop之後不會拋出StopIteration異常。
send()必須給生成器傳遞一個對象,且只能傳遞一個對象,其中第一次必須傳遞None。
五、生成器的神奇之處
1. 極大的減少了對內存的佔用。
2. 可以實現協同作業,比如爬蟲框架scrapy中處處yield。
六、小結
yield和生成器是python獨特的功能,在大文件、網絡傳輸、遞歸、多線程等有強大作用。
閱讀更多 IT老友 的文章