python裏的生成器--yield

Python的生成器是個很強大的東西,特別是在python3.0版本以後。以最簡單的方式讓大家快速理解生成器。

1、正常的寫法
來看個例子,比如輸出一個自定義長度的列表一般這麼寫:
python裏的生成器--yield
這裏傳入的參數時10,所以會得到一個包含10個元素的列表:
python裏的生成器--yield
那當我傳入的是10W的時候,那生成的這個列表就很大了,也佔內存,運行腳本也佔cpu。

2、改良後寫法
改良一下代碼,把他寫成一個迭代的類:
python裏的生成器--yield
這裏面self.b就記錄了每次執行next方法的位置,知道每次是第幾次執行next方法,所以執行保證了每次輸出的是期望的值,其實這就是迭代了,每運行一次函數都被記錄已運行的狀態。當被調用的時候才返回值,否則就處於等待被調用的狀態
運行結果:
python裏的生成器--yield
所以這改良後的代碼就解決了當你輸入10W的時候佔用資源的問題,因爲輸入10W後,只要當調用next函數的時候才返回值,不是一次返回一個那麼大的列表出來。
3、生成器
那麼第二步中的代碼跟第一步比起來又太多了感覺,那麼生成器就來了

再改良代碼:
python裏的生成器--yield
只需改下第一步中的代碼a.append(n)爲yield n,這就是一個生成器了,然後通過for語句來調用生成器的值。

任何一個帶有yield語句的函數都是生成器,當你直接調用這個函數時,內部的代碼是不會被執行的,只有調用yield裏面的next函數纔會去執行代碼,for循環也就是會自動去調用這個next函數來輸出值。

可以理解爲一個函數被yield中斷了,下載再次調用時繼續從上一次中斷的位置繼續執行代碼並返回值。

講的比較簡單,不知道大家理解了沒有。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章