1. 程式人生 > >Python:迭代器、可迭代物件、生成器

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__方法,不需要我們去實現)

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