Iterator與Iterable(迭代器與可迭代)

工作手记發表於2024-07-28

一 前言

環境: python 3.10 win10

二 Iterator(迭代器)

Iterator 是python的內建型別之一,看下其定義
image

該型別的例項物件稱之為iterator(迭代器物件)
要得到一個iterator(迭代器物件),可用內建函式iter()將 list tuple等轉成迭代器物件
也可以自定義一個迭代器型別的class,該class的例項物件就是迭代器物件

迭代器物件需要支援一下兩個方法:

  • iterator.iter(): 返回迭代器物件本身()

  • iterator.next():重複呼叫該方法,將逐個返回迭代器中的資料,如果已經沒有可返回的項,則會引發 StopIteration 異常

下面自定義一個迭代器物件的class,該class的迭代器物件透過__next__()或者內建函式next()能不斷返回偶數
image

實際使用中,並不需要一直重複呼叫next(),因為迭代器物件也一定是後面講的可迭代物件,所以。可直接將迭代器用於for迴圈中,不斷返回其中的資料
image

注意,上圖中第一次呼叫Get_num()方法時,並沒有列印出資料
因為這時候使用的迭代器物件it和之前程式碼中next(it)的it是同一個物件,而之前該迭代器物件已經輸出到數字6,這時候再呼叫Get_num()方法,方法中for迴圈其實也是不斷呼叫next()方法,所以此時Get_num()中得到的數字是8,而數字8遇到break就不會列印出來

第二次呼叫Get_num(),我們重新生成了一個迭代器物件作為引數傳了進去,和之前的不是一個物件,作為一個全新的迭代器物件,此時就會按照class的定義從0開始輸出

用內建函式轉換得到的迭代器物件也有上面兩個方法
image

判斷一個物件是否是否是Iterator型別
image

三 Iterable(可迭代)

Iterable也是一種型別即class ,看下其定義
image

這種型別的物件稱為可迭代物件,它是一種能夠逐個返回其成員項的物件。 可迭代物件的例子包括所有序列型別(如 list, str 和 tuple 等)以及某些非序列型別如 dict, 檔案物件 以及任何定義了 iter() 方法或實現了 sequence 語義的 getitem() 方法的自定義類的物件。

由上面可知,迭代器物件一定是可迭代物件,因為迭代器物件肯定支援__iter__()方法,class的定義也顯示Iterator繼承自Iterable
反過來,可迭代物件不一定是迭代器

英語單詞iterate本就有迭代、重複、反覆之意。
可迭代物件可用於for迴圈,不斷得到其中的資料

判斷一個物件是否是可迭代型別
image

相關文章