老衛帶你學 python迭代器和生成器

2021-10-09 01:31:19 字數 1390 閱讀 4357

實現了迭代器協議的物件,稱為迭代器。

2 可迭代物件:

遵循了(實現了)迭代器協議的物件。(物件內部定義了乙個__iter__()方法,以實現迭代器協議)

所以:列表、元組、字典、字串等等的都不是可迭代物件,當用for迴圈遍歷的時候,其實for先去執行了l.iter()方法,將列表、元組、字串等變成乙個可迭代的物件,在進行迭代。(iter()下有__next__()方法!)

這裡做乙個測試:可以看到list裡面並沒有next方法

那我們如果實現一下__iter__方法之後,就會有__next__方法:

3 可迭代物件和迭代器的關係

協議是一種約定,可迭代物件實現了迭代器協議,python的內部工具(如for迴圈,sum,min,max函式等)使用迭代器協議訪問物件。

for 迴圈的本質:遍歷所有物件,全都是使用迭代器協議。

for 迴圈就是基於迭代器協議提供了乙個統一的可以遍歷所有物件的方法,即在遍歷之前,先呼叫物件的__iter__方法將其轉換成乙個迭代器,然後使用迭代器協議去實現迴圈訪問,這樣所有的物件就都可以通過for迴圈來遍歷了,

列表,字串,元組,字典,集合,檔案物件等本質上來說都不是可迭代物件,在使用for迴圈的時候內部是先呼叫他們內部的_iter_方法,使他們變成了可迭代物件,然後在使用可迭代物件的_next_方法依次迴圈元素,當元素迴圈完時,會觸發stopiteration異常,for迴圈會捕捉到這種異常,終止迭代

生成器類似於一種資料型別,這種資料型別自動實現了迭代器協議(其他的資料型別需要呼叫自己內建的__iter__()方法),所以生成器就是可迭代物件

生成器分類及在python中的表現形式:(python有兩種不同的方式提供生成器)

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

2、生成器表示式:類似於列表推導,但是,生成器返回按需產生結果的乙個物件,而不是一次構建乙個結果列表,按需取出物件

yield生成器函式

在函式中通過yield來返回值,那麼這個函式返回的將是乙個生成器物件,這個函式叫生成器函式

老衛帶你學 python裝飾器

python的裝飾器,就是在不修改原有 的基礎上,增加額外的功能 假如我們原有乙個函式,這個函式它的功能是尋找1 n範圍內的偶數 def func for i in range 1000 if i 2 0 print i r func 此時列印如下 988990 992994 996998.那如果我...

老衛帶你學 PYTHON之WITH語句原理

我們看乙個with處理檔案操作的例項 with open etc passwd as f for line in f print line 這段 的作用 開啟乙個檔案,如果一切正常,把檔案物件賦值給f,然後用迭代器遍歷檔案中每一行,當完成時,關閉檔案 而無論在這段 的任何地方,如果發生異常,此時檔案...

老衛帶你學 numpy集合運算

集合運算 2018 11 11 1.np.unique 唯一值 它用幹找出陣列中的唯一值並返回已排序的結果 names np.array bob joe will bob np.unique names array bob will bob joe dtype sorted set names 等價...