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

  • 相关阅读:
    web 学习资源整理
    CodeSmith 学习资料收集
    常用 T_SQL 语句
    SQL Server 2000查询分析器自定义查询快捷键
    插入标识列 identity_insert
    c# 上传FTP文件
    (.Net 3.5Sp1)WebForm使用System.Web.Routing
    SPQuery.ViewAttributes
    ChatterBot之linux下安装mongodb 02
    linux端口开放指定端口的两种方法
  • 原文地址:https://www.cnblogs.com/white-small/p/6885246.html
Copyright © 2011-2022 走看看