python : 自定義可迭代類,__iter__ ,__next__的作用
技術標籤:python
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__函式時,單次判別後直接輸出。不滿足判別條件時輸出迭代終止。