python中的生成器
利?迭代器,可以在每次迭代讀取數據(通過next()?法)時按照特定的規律進??成。但是我們在實現?個迭代器時,關于當前迭代到的狀態需要我們??記錄,進?才能根據當前狀態?成下?個數據。為了達到記錄當前狀態,并配合next()函數進?迭代使?,我們可以采?更簡便的語法,即?成器(generator)。?成器是?類特殊的迭代器。
?
創建?成器?法1
要創建?個?成器,有很多種?法。第?種?法很簡單,只要把?個列表?成式的[]改成()
?
創建?成器?法2
generator?常強?。如果推算的算法比較復雜,?類似列表?成式的????????for循環?法實現的時候,還可以?函數來實現。
在使??成器實現的?式中,我們將原本在迭代器????????__next__?????????法中實現的基本邏輯放到?個函數中來實現,但是將每次迭代返回數值的return換成了 yield,此時新定義的函數便不再是函數,?是?個?成器了。
總結
?1.使?了yield關鍵字的函數不再是函數,?是?成器。(使?了yield的函數就是?成器)
2.yield關鍵字有兩點作?:
????????????????? 保存當前運?狀態(斷點),然后暫停執行,即將?成器(函數)掛起
???????????????? 將yield關鍵字后?表達式的值作為返回值,此時可以理解為起到了return的作?
可以使?next()函數讓?成器從斷點處繼續執行,即喚醒?成器(函數)
Python3中的?成器可以使?return返回最終運?的返回值,?Python2 中的?成器不允許使?return返回?個返回值(即可以使?return從?成器中退出,但return后不能有任何表達式)。
?
?
使?send喚醒
我們除了可以使?next()函數來喚醒?成器繼續執?外,還可以使?send()函數來喚醒執?。使?send()函數的?個好處是可以在喚醒的同時向斷點處傳入??個附加數據。
注意:??
?gen_obj.__next__()???? 等價于 gen_obj.send(none)
總結
以上是生活随笔為你收集整理的python中的生成器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库练习(二)三个数据库根据指定id获
- 下一篇: python中的字符串操作及注意事项