關於Python生成器,如何使用?
自從PEP 255引入以來,生成器一直是Python的重要組成部分。
生成器函式允許您宣告一個行為類似於迭代器的函式。
它們允許程式設計師以快速、簡單和乾淨的方式建立迭代器。
你可能會問,什麼是迭代器?
迭代器是一個可以迭代(迴圈)的物件。它用於抽象資料容器,使其行為類似於可迭代物件。您可能已經每天使用一些可迭代物件:字串、列表和字典等等。
迭代器由實現迭代器協議的類定義。該協議在類中查詢兩種方法:__iter__和__next__。
為什麼你想要製作迭代器?
節省記憶體空間
迭代器在例項化時不會計算每個項的值。他們只在你要求時計算它。這被稱為惰性評估。
當您有一個非常大的資料集要進行計算時,延遲評估很有用。它允許您在計算整個資料集時立即開始使用資料。
假設我們想要得到所有小於最大值的質數。
我們首先定義檢查數字是否為素數的函式:
然後,我們定義將包含__iter__和__next__methods的迭代器類:
Primes以最大值例項化。如果下一個素數大於或等於max,則迭代器將引發StopIteration異常,結束迭代器。
當我們請求迭代器中的下一個元素時,它會將數字增加1並檢查它是否為素數。如果不是,它將呼叫__next__again直到數字為素數。一旦它是,迭代器返回數字。
透過使用迭代器,我們不會在記憶體中建立素數列表。相反,我們每次請求時都會生成下一個素數。
我們來試試吧:
Primes物件的每次迭代都會呼叫__next__來生成下一個素數。
迭代器只能迭代一次。如果您嘗試再次遍歷素數,則不會返回任何值。它將表現得像一個空列表。
現在我們知道迭代器是什麼以及如何製作迭代器,我們將繼續研究生成器。
生成器
回想一下,生成器函式允許我們以更簡單的方式建立迭代器。
生成器將yield語句引入Python。它有點像return,因為它返回一個值。
不同之處在於它儲存了函式的狀態。下次呼叫該函式時,執行將從它停止的位置繼續執行,其變數值與生成前相同。
如果我們將Primes迭代器轉換為生成器,它將如下所示:
現在這是相當pythonic!我們可以做得更好嗎?
是!我們可以使用PEP 289引入的Generator Expressions。
這是生成器的列表理解等價物。它的工作方式與列表推導完全相同,但表示式用()而不是[]包圍。
以下表示式可以替換上面的生成器函式:
這是Python中生成器的美妙之處。
綜上所述...
生成器允許您以非常pythonic的方式建立迭代器。
迭代器允許延遲評估,僅在請求時生成可迭代物件的下一個元素。這對於非常大的資料集很有用。
迭代器和生成器只能迭代一次。
生成器函式優於迭代器。
Generator表示式優於迭代器(僅適用於簡單情況)。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545819/viewspace-2218849/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何使用python生成器Python
- python中生成器的使用Python
- python如何快速建立生成器Python
- 如何編寫 Python 文件生成器Python
- [譯] 什麼是 JavaScript 生成器?如何使用生成器?JavaScript
- Python系列(三):關於迭代器和生成器,你該瞭解這些Python
- python如何建立遞增的生成器Python
- python是如何實現生成器的Python
- Python偽資料生成器Mimesis 使用Python
- 關於高效使用Python字典的清單Python
- 關於pythonPython
- 關於如何在Tomcat中使用JavaBeanTomcatJavaBean
- Python 生成器Python
- python生成器Python
- 關於如何在Python中使用靜態、類或抽象方法的權威指南Python抽象
- 關於使用maven打包如何聚合資原始檔Maven
- python:關於pipPython
- sqlalchemy在python中的使用(關於查詢)二SQLPython
- Python 進階_生成器 & 生成器表示式Python
- Python的生成器Python
- Python Generators(生成器)Python
- python關於+=的陷阱Python
- 關於 Python 的 importPythonImport
- Python--關於dictPython
- Python--關於setPython
- python 生成器&迭代器Python
- Python迷宮生成器Python
- python跳坑---生成器Python
- python中的生成器Python
- python生成器的效率Python
- Python 3 中生成器函式yield表示式的使用Python函式
- 關於Remix的使用REM
- 關於split的使用
- 關於OScache,swarmcache使用Swarm
- 關於Python小遊戲程式Python遊戲
- 關於python整合dlibPython
- 關於Python的迭代操作Python
- 關於Python的集合setPython