• 迭代器&生成器


    1、迭代器:

    可迭代对象 

    #  如何判断一个对象是不是可迭代对象
    # 方法一:isinstance(obj,Iterable)
    # 方法二:看有没有__iter__方法

    迭代器协议:

    #1、迭代器类型必须包含 __iter__和__next__
    #2、__iter__方法必须返回 self
    #3、__next__必须返回下一个值,没有则抛出 StopIterator 异常
    #4、对迭代器执行for循环 每次都会执行__next__方法
    #5、迭代器只能迭代一次 不能重复 迭代中每次都是一个新的数据 占用内存少
    #6、for语句会忽略StopIterator异常
    class Next():
        def __init__(self,stop,start=0):
            self.start = 0
            self.stop = stop
    
        def __iter__(self):
            return  self
    
        def __next__(self):
            """
            返回下一个数
            :return: 如果有返回下一个数,没有就抛出 StopIteration异常
            """
            if self.start>=self.stop-1:
                raise StopIteration
            else:
                self.start += 1
                return self.start
    
    
    if __name__ == '__main__':
        obj = Next(5)
        for i in obj:
            print(i)
    
        # print(obj.__next__())
        # print(obj.__next__())
        # print(obj.__next__())
        # print(obj.__next__())
        # print(obj.__next__())
    

      

    如何判断:

    #1、过isinstance(obj,Iterator)
    #2、看对象有没有 __iter__属性 __next__属性
    from  typing import Iterator
    obj = iter(range(1,2))
    print(isinstance([1,2,3],list))      #True
    print(isinstance(obj,Iterator))      #True
    print(isinstance([1,2,3],Iterator))  #False
    
    """
    list和 可迭代对象区别
    """
    # for attr in dir(list):
    #     print(attr)   #__next__
    
    for attr in dir(obj):
        print(attr)   #__next__    还有__iter__

    生成器

    为了快速方便创建一个迭代器

    yield 实现快速创建迭代器,也就是 一个函数中有yield关键字,调用函数的时候不会执行函数的内容,会返回一个对象(这个对象类型是生成器类)

    当要访问生成器的__next__方法时,函数会编程running状态,当执行完yield时,函数变成非running状态(即挂起),

    只有再次执行生成器对象的__next__方法时函数才会被唤醒。

    一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己的内置的__iter__方法),所以生成器就是可迭代对象

    实现生成器的两种方法

    1、直接通过函数中添加yield

    def squares(start, stop):  # 第二种
        for i in range(start, stop + 1):
            yield i * i
    squares(1,2)
    # <class 'generator'>

    2、通过推导式

    squares2 = (i * i for i in range(1, 4))
    # <class 'generator'>

    都是返回生成器类

    生成器执行顺序:

    # 当要访问生成器的__next__方法时,函数会编程running状态,当执行完yield时,函数变成非running状态(即挂起),

    参考博客:https://blog.csdn.net/bandaoyu/article/details/88254937

  • 相关阅读:
    设计模式学习(十二) 责任链模式
    设计模式学习(十一) 享元模式
    设计模式学习(十) 外观模式
    设计模式学习(九) 装饰模式
    设计模式学习(八) 组合模式
    设计模式学习(七) 桥接模式
    设计模式学习(六) 代理模式
    设计模式学习(五) 适配器模式
    设计模式学习(四) 原型模型
    设计模式(三) 建造者模式
  • 原文地址:https://www.cnblogs.com/XXQQ123/p/14471977.html
Copyright © 2020-2023  润新知