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 
    

  • 相关阅读:
    8.【原创】使用Java8中的Stream特性筛选数据
    27.【转载】如何避免回表查询,什么是索引覆盖
    17.【转载】广东省2020学位英语考试报考须知
    Java 正则?:?=?!的理解
    集合的优化操作
    ArrayList中remove方法和set(null)的区别
    POI 导入、导出Excel
    JS 跳转到新页面并用post传参
    win 10 如何关闭自动更新
    JSON定义及应用
  • 原文地址:https://www.cnblogs.com/songhaixing/p/14238386.html
Copyright © 2011-2022 走看看