实现迭代器__iter__ 和 __next__

前面迭代器那一章我们讲解了可迭代对象和迭代器对象的特点以及 For 循环的原理 :

  • 可迭代对象 (iterable) : 在python中,但凡内置有 __iter__方法的对象,都是可迭代的对象

  • 迭代器对象 (iterator) : 内置有__next____iter__方法的对象, 就是迭代器对象, 可迭代对象执行__iter__得到的返回值就是迭代器对象

  • For 循环原理请到上面链接查看 (重点)

接下来我们来给一个类重写 __iter__ 以及 __next__ 方法, 让其可以迭代, 也可以被 for 循环

class Foo:
    def __init__(self,start,end):
        self.__start=start-1
        self.__end=end
​
    def __iter__(self):
        return self
​
    def __next__(self):
        self.__start+=1
        if self.__start>=self.__end:
            raise StopIteration("超出值")   # 抛出一个异常,For循环会检测异常自动结束循环
        return self.__startfor i in Foo(1,6):
    print(i)    
​
'''输出内容
1
2
3
4
5
'''

在函数学习的那一章节, 我们通过函数实现了 MyRange, 现在我们试试使用类来实现

class MyRange:
    def __init__(self,start,stop,step=1):
        self.__start = start-1
        self.__stop = stop
        self.__step = step
​
    def __iter__(self):
        return self
​
    def __next__(self):
        self.__start += self.__step
        if self.__start >= self.__stop:
            raise StopIteration("超出值")  # 抛出异常
        return self.__startfor i in MyRange(0,10,2):
    print(i)  # 1 3 5 7 9

应用示例 : 产生一个小于某值的斐波那契数列

class Fib:
    def __init__(self,count):
        self.__start = 0
        self.__stop = 1
        self.__count = count
​
    def __iter__(self):
        return self
​
    def __next__(self):
        self.__start,self.__stop = self.__stop,self.__start+self.__stop
        if self.__start >= self.__count:
            raise StopIteration("超出")  # 抛出异常
        return self.__startfor i in Fib(50):
    print(i)  # 1 1 2 3 5 8 13 21 34