zoukankan      html  css  js  c++  java
  • 迭代器生成器

    1、可迭代对象

    可以循环遍历的都是可迭代对象,例如字符、列表、元组、字典、迭代器等等,可以使用for循环迭代的标志是内部实现了__iter__方法。

    list1=[1,2,3,4,5,6]
    print(list1)
    #将迭代对象转换为迭代器 
    iter1=iter(list1)   
    print(next(iter1))

    运行结果:

    [1, 2, 3, 4, 5, 6]
    1

    使用isinstance(实体名,Iterable)可判断是否为可迭代对象

    2、迭代器

    迭代器就是实现了迭代方式的容器,iterable对象一般只能按默认的正序方式进行迭代。迭代器内部实现了__iter__方法和__next__方法。

     next()方法用于定制for循环时具体的返回值及返回顺序以及处理StopIteration异常等。

    使用isinstance(实体名,Iterator)可判断是否为迭代器

    list1=[1,2,3,4,5,6]
    print(list1)
    #将迭代对象转换为迭代器
    iter1=iter(list1)
    print(next(iter1))
    print(next(iter1))
    print(next(iter1))
    print(next(iter1))
    print(next(iter1))
    print(next(iter1))
    print(next(iter1))

    运行结果:

    [1, 2, 3, 4, 5, 6]
    Traceback (most recent call last):
    1
    2
    3
    4
    5
    6
      File "/Users/grace/PycharmProjects/selenium/test.py", line 79, in <module>
        print(next(iter1))
    StopIteration

    3、生成器

    generator对象是一种特殊的iterator函数,它会在执行过程中保存执行的上下文环境,并在下次循环中从yield语句后继续执行,生成器的标志就是yield关键字。

    generator不需要抛出StopIteration异常(你可以看做yield已经在内部实现了StopIteration跳出循环),函数并没有将序列项一次生成,所以generator在实现上可以有无穷个元素,而不需要无穷的存储空间,这在内存优化方面很有用处。

    使用isinstance(实体名,Generator)可判断是否为生成器。

    生成器的创建办法有两种:

    • 通过函数创建,称作generator function
    • 通过推导式创建,例如g=(x*2 for x in range(10)),称作generator expression、

    生成器和迭代器的区别:

    • 生成器比迭代器多了三种方法:send(),close(),throw()
    • send():发送数据
    • close():关闭生成器
    • throw():gen.throw(Exception,"Method throw called")
    #创建一个生成器函数
    def gen():
        for i in range(5):
            x=yield i
            print("x=%s"%x)
    gen=gen()
    print(next(gen))
    print(gen.send(100))
    print(next(gen))

    运行结果:

    0
    x=100
    1
    x=None
    2

    生成器最大的好处在于:generator_list(a)并不会真正执行函数的代码,只有在被循环时才会去获取值,且每次循环都return一个值(即yield一个值),在处理完毕后下次循环时依然使用相同的内存(假设处理单位大小一样)来获取值并处理,这样在一次for循环中函数好像中断(yield)了无数次,每次都用相同大小的内存来存储被迭代的值。

    yield与return的最大区别就是yield并不意味着函数的终止,而是意味着函数的一次中断,在未被迭代完毕之前yield意味着先返回一次迭代值并继续下一次函数的执行(起始位置是上一次yeild语句结束),而return则基本意味着一个函数的彻底终止并返回一个全量的返回值。

    参考:https://www.cnblogs.com/leohahah/p/10189281.html

  • 相关阅读:
    怎么判断自己在不在一家好公司?
    超全!互联网大厂的薪资和职级一览
    Nginx 又一牛 X 功能!流量拷贝
    时间管理之四象限法则
    罗永浩一个坑位卖60万脏钱背后:放下面子赚钱,才是成年人最大的体面
    2020 年 4月全国程序员工资出炉
    一次 SQL 查询优化原理分析(900W+ 数据,从 17s 到 300ms)
    “Hey Siri” 背后的黑科技大揭秘!
    一文讲透高薪的本质!
    python UnicodeDecodeError: 'gbk' codec can't decode byte 0x99 in position 87: illegal multibyte sequence异常解决
  • 原文地址:https://www.cnblogs.com/crystal1126/p/13516025.html
Copyright © 2011-2022 走看看