zoukankan      html  css  js  c++  java
  • python基础-------迭代器,生成器,协程函数

    1,迭代器协议:

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

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

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

    2,迭代器:

    1.1:为什么要用迭代器:

    1.2 优点:迭代器提供了一种不依赖索引的取值方式,这样就可以遍历那些没有索引的可迭代对象,如:(字典,集合,文件)

                迭代器于列表比较,迭代器属于惰性计算,更省内存。

    1.3 缺点:无法获取迭代器的长度,不如列表操作灵活。一次性的取值,只能从前向后取值,不能从后向前取值。

    1.4 可迭代的,只要对象本身有__iter__方法,得到的就是迭代器。

    1.5 列表list,元组tuple,字典dict,集合set,字符串str,文件file,都是可以迭代的。

    1.6 示例:笨方法

    d = {"a":1,"b":2,"c":3,}
    i = d.__iter__()   #把字典变成一个可迭代的对象,i 就是迭代器
    print(i.__next__())
    print(i.__next__())
    print(i.__next__())

    1.7 运行结果:把字典里的k都打印出来了

    1.8 用while来遍历字典:

    d = {"a":1,"b":2,"c":3,}
    i = d.__iter__()
    while True:
        print(i.__next__())

    1.9 运行结果字典可k全部打印出来了,但是,while是一个死循环,遍历玩字典里的三个k,就抛出了StopIteration异常,我们这样处理就好了

    a
    Traceback (most recent call last):
    b
    c
      File "F:/PycharmProjects/py_fullstack_s4/day23/迭代器.py", line 4, in <module>
        print(i.__next__())
    StopIteration

    2.0  把代码改成这样:

    d = {"a":1,"b":2,"c":3,}
    i = d.__iter__()
    while True:
        try:
            print(i.__next__())
        except StopIteration:
            break

    2.1 try ,except 是去除异常的语句,运行结果如下:

    a
    b
    c

    2.2 用 for 循环来遍历:

    d = {"a":1,"b":2,"c":3,}
    
    for k in d:
        print(k)

    2.3 因为for 是非常牛逼的,他自己只接把d转成迭代器了,运行结果就是,a,b,c,

    2.4 查看可迭代对象与迭代器对象:

    s = "hello world"                                  #字符串 str
    l = ["h","e","l","l""o"]                #列表 list
    t = ("w","o","r","l","d")                          #元组 tuble
    d = {"name":"gaoyuan","job":"IT","age":25}         #字典 dict
    set1 = {1,2,3,4,5,}                                #集合 set
    f = open("a.txt")                                  #文件 file
    
    #都是可迭代的:都有__iter__方法
    # s.__iter__()
    # l.__iter__()
    # t.__iter__()
    # d.__iter__()
    # set1.__iter__()
    # f.__iter__()
    print(isinstance(s,Iterable))
    print(isinstance(l,Iterable))
    print(isinstance(t,Iterable))
    print(isinstance(d,Iterable))
    print(isinstance(set1,Iterable))
    print(isinstance(f,Iterable))
    #返回的结果都是True  
    
    #查看是否是迭代器 ,只有文件有__next__方法,
    f.__next__()
    
    print(isinstance(s,Iterator))  #False
    print(isinstance(l,Iterator))   #False
    print(isinstance(t,Iterator))   #False
    print(isinstance(d,Iterator))   #False
    print(isinstance(set1,Iterator))#False
    print(isinstance(f,Iterator))      #True
    #只有文件是迭代器

    3,生成器:

    3.1 什么是生成器?

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

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

    生成器就是一个函数,函数体内含有yield关键字 就是生成器

    return跟yield的区别

    return返回一次值就彻底结束了,yield能返回多次值

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

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

    3.2 为何使用生成器之生成器的优点

    3.3 Python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。这也是生成器的主要好处。

    3.4 生成器小结:

    3.4.1.是可迭代对象

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

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

  • 相关阅读:
    Jackson
    Jackson
    SAX
    SAX
    JDK Tools
    JAXB
    linux系统mysql连接检查脚本
    linux系统ssh远程连接检查脚本
    linux系统带宽监测脚本
    linux系统web日志分析脚本
  • 原文地址:https://www.cnblogs.com/gaoyuan111/p/6694922.html
Copyright © 2011-2022 走看看