• python之路--迭代器和生成器


    迭代:

      迭代器协议: 

      1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退)

      2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)

      3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象

      for循环实现迭代的原理

      1.调用__iter__()方法,将后面序列转为可迭代对象

      2.调用__next__方法,读取内容,读取到StopIteration异常,以终止迭代。

    name=[1,2,3,4,5]
    for i in name:
        print(i)
    
    实现for循环的原理 :
    name=name.__iter__()
    while True:
        try:
            print(name.__next__())
        except StopIteration:
            break

       判断是否为迭代器的方法:用Iterator

    from collections import Iterator  
    isinstance({}, Iterator)  --> False  
    isinstance((), Iterator) --> False  
    isinstance( (x for x in range(10)), Iterator)  --> True   

      凡是可以for循环的,都是Iterable

      凡是可以next()的,都是Iterator

      集合数据类型如list,truple,dict,str,都是Itrable不是Iterator,但可以通过iter()函数获得一个Iterator对象

      

    生成器(优点:节省内存):

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

      生成器分类及在python中的表现形式:(Python有两种不同的方式提供生成器)

      1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

      2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

    #函数表达式
    a=(i for i in range(100))
    print(a)
    print(a.__next__())
    # 函数表达式
    def generator_test():
        yield 1
        yield 2
        yield 3
    
    b=generator_test()
    print(b)
    print(b.__next__())
    print(b.__next__())
    print(b.__next__())
    print(b.__next__())
    View Code

      

    生成器小结:

      1.是可迭代对象

      2.实现了延迟计算,省内存啊

      3.生成器本质和其他的数据类型一样,都是实现了迭代器协议,只不过生成器附加了一个延迟计算省内存的好处,其余的可迭代对象可没有这点好处,记住喽!!!

    触发函数生成器的方法:

      1.__next__

      2.next()

      3.send()  #send会将参数赋值给yield

    参考链接:https://www.cnblogs.com/linhaifeng/p/6133014.html

  • 相关阅读:
    三毛
    深复制和浅复制
    并发和并行
    PhotoKit保存图片到相册
    利用代码块
    Maven打包程序
    通过Nginx+Tomcat简单实现发布时不间断服务的提供
    C# java MD5加密方不一致问题
    SpringBoot读取配置值的方式
    Java8之集合排序
  • 原文地址:https://www.cnblogs.com/white-small/p/6885246.html
Copyright © 2020-2023  润新知