1. 程式人生 > >知識總結和記錄——叠代器和生成器

知識總結和記錄——叠代器和生成器

lap 開發 遍歷 而不是 分享 數據 統一 alt 內置

叠代

可以被for循環的都是可叠代的(字符串、列表、元祖、字典、集合),就是將某個數據集內的數據“一個挨著一個的取出來”,就叫做叠代

可叠代協議

可以被叠代要滿足的要求就叫做可叠代協議。可叠代協議的定義,就是內部實現了__iter__方法

叠代器Iterator

叠代器遵循叠代器協議:必須擁有__iter__方法和__next__方法

技術分享圖片

for循環

for循環就是基於叠代器協議提供了一個統一的可以遍歷所有對象的方法,即在遍歷之前,先調用對象的__iter__方法將其轉換成一個叠代器,然後使用叠代器協議去實現循環訪問,這樣所有的對象就都可以通過for循環來遍歷了,這就是無所不能的for循環

生成器Generator

  本質:叠代器(所以自帶了__iter__方法和__next__方法,不需要我們去實現)

  特點:惰性運算,開發者自定義

生成器函數:yield關鍵字

1.生成器函數:常規函數定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回一個結果,在每個結果中間,掛起函數的狀態,以便下次從它離開的地方繼續執行

2.生成器表達式:類似於列表推導,但是,生成器返回按需產生結果的一個對象,而不是一次構建一個結果列表

技術分享圖片send 技術分享圖片yield from

列表推導式和生成器表達式

1.把列表解析的[]換成()得到的就是生成器表達式

2.列表解析與生成器表達式都是一種便利的編程方式,只不過生成器表達式更節省內存

3.Python不但使用叠代器協議,讓for循環變得更加通用。大部分內置函數,也是使用叠代器協議訪問對象的。例如, sum函數是Python的內置函數,該函數使用叠代器協議訪問對象,而生成器實現了叠代器協議,所以,我們可以直接這樣計算一系列值的和:

sum(x ** 2 for x in range(4))

而不用多此一舉的先構造一個列表:

sum([x ** 2 for x in range(4)]) 

  

技術分享圖片

生成器相關面試題

技術分享圖片題1 技術分享圖片題2

知識總結和記錄——叠代器和生成器