1. 程式人生 > 其它 >python : 自定義可迭代類,__iter__ ,__next__的作用

python : 自定義可迭代類,__iter__ ,__next__的作用

技術標籤:python

轉自:https://blog.csdn.net/Strive_For_Future/article/details/91306814?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

python_迭代器協議

一、定義

1、迭代器協議是指:物件必須提供一個next方法,執行方法要麼返回迭代器中的下一項,要麼就引起一個StopIteration異常,以終止迭代(單向執行:只能前進,不能倒退);

2、可迭代物件:實現了迭代器協議的物件(實現方式:物件內部定義了一個iter()方法);

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

二、迭代器協議的實現

迭代器協議規定了物件必須提供一個next方法和iter方法。

正式的說法是:實現了__iter__方法的物件是可迭代物件,實現了__next__方法的物件是迭代器。

在python3中,如果定義了一個類,類中有 __iter__(self),__next__(self)兩個函式,則該類具有了迭代器的屬性,

具體性質體現在:

如果該類的物件出現在一個for迴圈中,那麼for迴圈會自動通過__iter__標誌識別這是一個可迭代的類,繼而自動呼叫__next__()函式

class Fab(object):
    def __init__(self,max,):
        self.max=max
        self.n,self.a,self.b=0,0,1
    def __iter__(self):
        return self
    def __next__(self):
        if self.n < self.max:
            out = self.b
            self.a,self.b=self.b,self.a+self.b
            self.n = self.n+1
            return out
        raise StopIteration()
    
for i in Fab(6):
    print(i)

返回結果:

1
1
2
3
5
8

總結:

1)通過在類中新增 __iter__函式,向系統說明這是一個可迭代物件。

2)通過在類中新增 __next__函式,向系統提供該可迭代物件的迭代演算法

3)在程式碼執行過程中,for迴圈函式會自動檢查系統資訊,識別__iter__函式,然後自動呼叫對應的__next__函式,生成一個迭代器。

4)所以在定義一個可迭代類時,一般__iter__ 函式要與 __next__函式成對出現。__iter__函式向系統宣告這個類可迭代,__next__定義了具體的迭代器。

5)__iter__ 與 __next__兩個函式名不可改變,否則系統會不識別。

6)__next__函式的 return 在 if 判別命令的內部,每次執行__next__函式時,單次判別後直接輸出。不滿足判別條件時輸出迭代終止。