Python快速入門之疊代器和生成器!最詳細的教程!祝早日入門!

Python快速入門之迭代器和生成器!最詳細的教程!祝早日入門!

幸運的是,在當今時代,各種市場因素已將內存、磁盤甚至 CPU 容量的價格統統壓縮至原先難以想象的低價。但與此同時,諸如大數據、AI 和認知計算這類蓬勃發展的應用,正在以超快的速度推升我們對於這些資源的需求。令人感覺有點啼笑皆非的是,當計算資源較充足時,開發人員瞭解如何降低資源耗用量來保持競爭力卻變得愈加重要。

是不是非常重要,私信小編007即可獲取數十套PDF哦!

Python快速入門之迭代器和生成器!最詳細的教程!祝早日入門!

Python 的 for 語句在所謂的 迭代器 上運行。迭代器是可重複調用以生成一系列值的對象。如果 in 關鍵字後的值尚未成為迭代器,那麼 for 會嘗試將其轉換為迭代器。內置 range 函數就是可以轉換為迭代器的一個示例。它可生成一系列數字, for 循環會對這些項進行迭代,依次將每個項分配到變量 ix 。

Python快速入門之迭代器和生成器!最詳細的教程!祝早日入門!

此時會打印 0,這與您的預期相符。接下來再次輸入 print(next(r)) ,將會打印 1,以此類推。繼續在此行中輸入。在這一點上,值得高興的是,對於大部分系統,只需按 Python 解釋器上的向上箭頭即可檢索最近使用的命令,然後按 Enter 鍵即可重複執行命令,您甚至還可以在按 Enter 鍵之前隨意對其進行調整。

在此情況下,最終將得到類似如下的結果:

Python快速入門之迭代器和生成器!最詳細的教程!祝早日入門!

它會打印消息“That's all folks!” for 語句使用 StopIteration 異常來確定何時退出循環。

其他可迭代對象

range 只是可轉換為迭代器的一種對象。以下解釋器會話演示瞭如何將各種標準類型解釋為迭代器。

Python快速入門之迭代器和生成器!最詳細的教程!祝早日入門!

對於列表或元組,這是非常直接的過程。字典僅對其鍵進行迭代,當然無法保證順序。對於集合也無法保證迭代順序,即使在此示例中,來自迭代器的首個項碰巧也是用於構造集合的元組中的首個項。字符串會對其字符進行迭代。所有此類對象都稱為 可迭代對象 。

正如您可能想到的,並非每個 Python 對象都可轉換為迭代器。

Python快速入門之迭代器和生成器!最詳細的教程!祝早日入門!

以上是一個自動的生成器函數,因為其主體中包含至少一條 yield 語句。這一細微差別是將常規函數轉變為生成器函數的唯一因素,這有點棘手,因為常規函數與生成器函數之間存在巨大差異。

以類似任何其他函數的方式來調用生成器函數:

Python快速入門之迭代器和生成器!最詳細的教程!祝早日入門!

生成器函數自變量

生成器函數接受自變量,這些自變量可傳遞到生成器主體中。粘貼以下生成器函數。

Python快速入門之迭代器和生成器!最詳細的教程!祝早日入門!

我從一個生成器函數創建兩個生成器對象。隨後,我可從其中任一對象獲取下一個項,並留意每個對象獨立暫掛和恢復的方式。它們在各個方面都彼此獨立,包括進入 StopIteration 的方式。

務必仔細研究此會話,直至您確實掌握整個過程為止。一旦掌握了這一過程,您也就真正對生成器有了基礎的認識,並明白了它們如此強大的原因所在。

請記住,您還可以使用所有常用的定位和關鍵字自變量功能。

Python快速入門之迭代器和生成器!最詳細的教程!祝早日入門!

Python快速入門之迭代器和生成器!最詳細的教程!祝早日入門!

weathermaker 函數使用了許多常用編程功能,並且還解釋了生成器的一些很有趣的特性。生成的項數並不固定。可能會與天數一樣少,也可能會因連續晴天或雨天而添加的註釋導致數量增加。這些都是在不同條件分支下生成的。

運行此清單後,應顯示如下內容:

Python快速入門之迭代器和生成器!最詳細的教程!祝早日入門!

請花些時間自行嘗試一下,首先為 volatility 和 days 傳入不同的值,然後對生成器函數代碼本身進行調整。試驗是確保您真正瞭解生成器運作方式的最佳途徑。

我希望這個有趣的示例通過生成器的一些強大功能,可以激發您的想像力。當然無需生成器也可以編寫上述代碼,但這種方法不僅更易於表達、通常更高效,並且除了清單底部的簡單循環之外,還能通過其他有趣的方法來複用 weathermaker 生成器。

Python快速入門之迭代器和生成器!最詳細的教程!祝早日入門!

簡而言之,只要您使用括號將 for 表達式括起,那麼它就會變成一個生成器表達式。生成的對象即為生成器對象,在此情況下此對象被分配至 words 。有時,您最後會使用某些更有趣的 Python 內容來適應此類表達式。在此情況下,我對字典使用 get 方法,此方法會查找一個鍵,但允許我指定未找到此鍵時返回的默認值。我要求系統返回 item 的替換值(如果能找到),否則僅按現狀返回 item 。

Python快速入門之迭代器和生成器!最詳細的教程!祝早日入門!

以上兩個示例之間的實際差異主要在於,第一個示例中創建的列表自創建之後便存在,會佔用所有必要內存來存儲其值。生成器表達式不會使用這麼多的存儲空間,而是處於暫掛狀態,當對其進行迭代時才恢復,就像生成器函數的主體一樣。事實上,它允許您按需獲取數據,而不是預先為您存儲所有數據。

Python快速入門之迭代器和生成器!最詳細的教程!祝早日入門!

在此係列教程中,有時我將從生成器構建列表,以便於快速展示。

過濾和鏈接

您可以在生成器表達式中使用簡單的條件從輸入迭代器中過濾掉某些項。以下示例可生成從 1 到 20 之間不是 2 和 3 的倍數的所有數字。它使用易用的 math.gcd 函數,返回這兩個整數的最大公約數。例如,如果某個數字和 2 的最大公約數為 1,那麼此數字不是 2 的倍數。

Python快速入門之迭代器和生成器!最詳細的教程!祝早日入門!

Python快速入門之迭代器和生成器!最詳細的教程!祝早日入門!

學習使用迭代器和生成器是掌握 Python 的一個重要步驟,而另一個重要步驟就是學習使用標準庫中為處理迭代器而提供的眾多神奇的工具。這將是本系列中下一個教程的主題。

是不是非常重要,私信小編007即可獲取數十套PDF哦!

Python快速入門之迭代器和生成器!最詳細的教程!祝早日入門!


分享到:


相關文章: