Python:迭代器、可迭代物件、生成器
1、什麼叫迭代
現在,我們已經獲得了一個新線索,有一個叫做“可迭代的”概念。
首先,我們從報錯來分析,好像之所以1234不可以for迴圈,是因為它不可迭代。那麼如果“可迭代”,就應該可以被for迴圈了。
這個我們知道呀,字串、列表、元組、字典、集合都可以被for迴圈,說明他們都是可迭代的。
我們怎麼來證明這一點呢?
Python學習資料或者需要程式碼、視訊加Python學習群:960410445
結合我們使用for迴圈取值的現象,再從字面上理解一下,其實迭代就是我們剛剛說的,可以將某個資料集內的資料“一個挨著一個的取出來”,就叫做迭代。
2、迭代器和協議
既什麼叫“可迭代”之後,又一個歷史新難題,什麼叫“迭代器”?
雖然我們不知道什麼叫迭代器,但是我們現在已經有一個迭代器了,這個迭代器是一個列表的迭代器。
我們來看看這個列表的迭代器比起列表來說實現了哪些新方法,這樣就能揭開迭代器的神祕面紗了吧?
這三個方法中,能讓我們一個一個取值的神奇方法是誰?
沒錯!就是__next__
在for迴圈中,就是在內部呼叫了__next__方法才能取到一個一個的值。
那接下來我們就用迭代器的next方法來寫一個不依賴for的遍歷。
這是一段會報錯的程式碼,如果我們一直取next取到迭代器裡已經沒有元素了,就會丟擲一個異常StopIteration,告訴我們,列表中已經沒有有效的元素了。
這個時候,我們就要使用異常處理機制來把這個異常處理掉。
3、可迭代物件
我們現在是從結果分析原因,能被for迴圈的就是“可迭代的”,但是如果正著想,for怎麼知道誰是可迭代的呢?
假如我們自己寫了一個數據型別,希望這個資料型別裡的東西也可以使用for被一個一個的取出來,那我們就必須滿足for的要求。這個要求就叫做“協議”。
可以被迭代要滿足的要求就叫做可迭代協議。可迭代協議的定義非常簡單,就是內部實現了__iter__方法。
迭代器生成的物件就是可迭代物件
4、生成器
Python中提供的生成器:
1.生成器函式:常規函式定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回一個結果,在每個結果中間,掛起函式的狀態,以便下次重它離開的地方繼續執行
2.生成器表示式:類似於列表推導,但是,生成器返回按需產生結果的一個物件,而不是一次構建一個結果列表
生成器Generator:
本質:迭代器(所以自帶了__iter__方法和__next__方法,不需要我們去實現)
特點:惰性運算,開發者自定義