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

  • 相关阅读:
    网页中的默认按钮
    心动不如行动
    周日骑行广州大学城
    买单车别买重车
    今晚好无聊
    在自行车论坛看到的有趣帖子
    php zend framework 生成 pdf 出现中文乱码
    FPDI Import existing PDF documents into FPDF
    PHP 哈希表,关联数组,遍历方法大全
    zend framework 如何多表查询
  • 原文地址:https://www.cnblogs.com/crystal1126/p/13516025.html
Copyright © 2011-2022 走看看