1. 程式人生 > >python_叠代器協議

python_叠代器協議

python python_叠代器協議 叠代器 叠代器協議

一.定義
1.叠代器協議是指:對象必須提供一個next方法,執行方法要麽返回叠代器中的下一項,要麽就引起一個StopIteration異常,以終止叠代(只能往後走,不能往前退)
2.可叠代對象:實現了叠代器協議的對象(實現方式:對象內部定義了一個iter()方法)
3.協議是一種約定,可叠代對象實現了叠代器協議,Python的內部工具(如for循環,sum,min,max函數等)使用叠代器協議訪問對象。
二.叠代器協議的實現
叠代器協議規定了對象必須提供一個next方法和iter方法。作為叠代器協議應用的代表就是for方法,那麽我們如何實現一個類似for功能的類呢?見下圖:
技術分享圖片
該部分代碼塊如下:

class For():
    def __init__(self,n):
        self.n = n
    def __iter__(self):
        print("執行了__iter__方法")
        return  self
    def __next__(self):
        print("執行了__next__方法")
        self.n += 1
        if self.n >= 16:
            raise StopIteration("叠代器終止")
        return self.n
f1 = For(10)
"""
#執行f1.__iter__()和iter(f1)效果完全相同
# f1.__iter__()
# iter(f1)
#執行f1.__next__()next(f1)效果完全相同
# print(f1.__next__())
# print(next(f1))
"""
for i in f1:        #先執行iter(f1)---->f1.__iter__()
    print(i)         #執行(next(f1)---->f1.__next__(),直至不滿足條件,拋出異常

其中,上面的next增加了停止條件,且實現的是一個自增1的操作,與range函數功能完全相同。其他的功能應該也是想類似。
三.叠代器與斐波拉契數列的實現
斐波拉契數列是指當前數字是前兩個數字之和,起始兩個數字均為1,例如:1,1,2,3,5,8,13......
技術分享圖片
技術分享圖片
該部分的代碼塊如下:

class Fibonacci():
    fib = []
    def __init__(self,n,m):
        self.n = n
        self.m = m
        self.fib = []
        self.fib.append(self.n)
        self.fib.append(self.m)

    def __iter__(self):
        return self

    def __next__(self):
        if self.m>=20:
            raise StopIteration("叠代器停止!!!")
        self.n,self.m = self.m,(self.n + self.m)
        self.fib.append(self.m)
        return self.fib

Fib = Fibonacci(2,3)
for i in Fib:
    print(i)

python_叠代器協議