關於Python生成器,如何使用?

人工智慧頻道發表於2018-11-06

關於Python生成器,如何使用?


自從PEP 255引入以來,生成器一直是Python的重要組成部分。

生成器函式允許您宣告一個行為類似於迭代器的函式。

它們允許程式設計師以快速、簡單和乾淨的方式建立迭代器。

你可能會問,什麼是迭代器?

迭代器是一個可以迭代(迴圈)的物件。它用於抽象資料容器,使其行為類似於可迭代物件。您可能已經每天使用一些可迭代物件:字串、列表和字典等等。

迭代器由實現迭代器協議的類定義。該協議在類中查詢兩種方法:__iter__和__next__。

為什麼你想要製作迭代器?

節省記憶體空間

迭代器在例項化時不會計算每個項的值。他們只在你要求時計算它。這被稱為惰性評估。

當您有一個非常大的資料集要進行計算時,延遲評估很有用。它允許您在計算整個資料集時立即開始使用資料。

假設我們想要得到所有小於最大值的質數。

我們首先定義檢查數字是否為素數的函式:

關於Python生成器,如何使用?


然後,我們定義將包含__iter__和__next__methods的迭代器類:

關於Python生成器,如何使用?


Primes以最大值例項化。如果下一個素數大於或等於max,則迭代器將引發StopIteration異常,結束迭代器。

當我們請求迭代器中的下一個元素時,它會將數字增加1並檢查它是否為素數。如果不是,它將呼叫__next__again直到數字為素數。一旦它是,迭代器返回數字。

透過使用迭代器,我們不會在記憶體中建立素數列表。相反,我們每次請求時都會生成下一個素數。

我們來試試吧:

關於Python生成器,如何使用?


Primes物件的每次迭代都會呼叫__next__來生成下一個素數。

迭代器只能迭代一次。如果您嘗試再次遍歷素數,則不會返回任何值。它將表現得像一個空列表。

現在我們知道迭代器是什麼以及如何製作迭代器,我們將繼續研究生成器。

生成器

回想一下,生成器函式允許我們以更簡單的方式建立迭代器。

生成器將yield語句引入Python。它有點像return,因為它返回一個值。

不同之處在於它儲存了函式的狀態。下次呼叫該函式時,執行將從它停止的位置繼續執行,其變數值與生成前相同。

如果我們將Primes迭代器轉換為生成器,它將如下所示:

關於Python生成器,如何使用?


現在這是相當pythonic!我們可以做得更好嗎?

是!我們可以使用PEP 289引入的Generator Expressions。

這是生成器的列表理解等價物。它的工作方式與列表推導完全相同,但表示式用()而不是[]包圍。

以下表示式可以替換上面的生成器函式:

關於Python生成器,如何使用?


這是Python中生成器的美妙之處。

綜上所述...

生成器允許您以非常pythonic的方式建立迭代器。

迭代器允許延遲評估,僅在請求時生成可迭代物件的下一個元素。這對於非常大的資料集很有用。

迭代器和生成器只能迭代一次。

生成器函式優於迭代器。

Generator表示式優於迭代器(僅適用於簡單情況)。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545819/viewspace-2218849/,如需轉載,請註明出處,否則將追究法律責任。

相關文章