相关文章推荐
精明的蘑菇  ·  MS Office2013 Excel VB ...·  11 月前    · 
闯红灯的大象  ·  绑定: ...·  1 年前    · 
直爽的领结  ·  java ...·  1 年前    · 

前面 迭代器 那一章我们讲解了可迭代对象和迭代器对象的特点以及 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 , 6 ): print ( i ) '''输出内容

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