zoukankan      html  css  js  c++  java
  • 十四. __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 
    

  • 相关阅读:
    vscode中执行gulp task的简便方法
    5G即将到来,你还会购买4G手机吗?
    小屏幕手机汇总
    NoSQL数据库的分布式算法详解
    如何在网页界面设计中正确的留出空白空间?
    iconfont的三种使用方式
    MySQL修改密码方法汇总
    Docker镜像与容器
    微观经济学
    经营的原点 书评
  • 原文地址:https://www.cnblogs.com/songhaixing/p/14238386.html
Copyright © 2011-2022 走看看