十四. __iter__ 和 __next__

十四. __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.__start

for i in Foo(1,10):
    print(i)  # 1 2 3 4 5 6 7 8 9 

在函数学习的那一章节, 我们通过函数实现了 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.__start

for 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.__start

for i in Fib(50):
    print(i)  # 1 1 2 3 5 8 13 21 34 

posted @ 2021-01-05 22:22  给你骨质唱疏松  阅读(290)  评论(0编辑  收藏  举报