• python3系列五可迭代对象、迭代器和生成器


    1.可迭代对象

    字符串、集合、列表、字典、元组都是可迭代的对象,数字不是可迭代的,就是可以通过for循环取出元素的对象,都是可迭代对象
    如果查看一个变量是否为可迭代:

    s = {1, 2, 3, 4}
    print(type(s)) #<class 'set'>
    print(isinstance(s,Iterable))


    可以被迭代要满足的要求就是可迭代协议,可迭代协议就是内部实现了__iter__方法,即可迭代对象封装中有__iter__方法。
    2.迭代器

    用变量调用__iter__后就生成一个迭代器,迭代器遵循迭代器协议,必须拥有__iter__方法和__next__方法。

    s_iter = s.__iter__() #s_iter是一个迭代器变量
    print(s_iter)
    print(s_iter.__next__())


    3.生成器

    本质是一个迭代器,不过是由程序员写出来的就叫生成器,系统内置的就叫迭代器;

    • 生成器的两种实现方式:

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

    def func():
        yield from range(4)


      2)生成器表达式
        类似于列表推导,把列表解析的[]换成()得到的就是生成器表达式,但是生成器返回按需产生的结果的一个对象,而不是一次构建一个结果列表;
     列表推导方式和生成器都是一种边里的编程方式,只不过生成器更节省内存。

    g=(i for i in range(4)) #g是一个生成器
    • 生成器的好处

      其不会一下子在内存中生成太多数据,只是在你要的时候才会返回你要的数据。

    • 生成器的例题:
    def add(n,i):
      return
    n+i def test(): for i in range(4): yield i g = test() # for n in [1,10]: # g =(add(n,i) for i in g)

    # 上面的for循环套用迭代器,等价如下,遇到for循环套生成器,就拆开来做
    n = 1
    g = (add(n, i) for i in g)
    n = 10 # 覆盖前面n的值
    g = (add(n, i) for i in g)    

    分析:
    g只是代表一个生成器对象,没有for,next,list,tuple调用它的时候它是不会执行的,真实的代码执行逻辑如下:
    第1次:n = 1, 执行g=(add(n,i) for i in test())
    第2次:n = 10,执行g=(add(n,i) for i in (add(n,i) for i in test())) )

    g因为前面做过定义,每次需要把之前定义的带入,所以当n=10 的时候,g=(add(10,i) for i in (add(n,i) for i in test())) )),最终的执行结果是[20, 21, 22, 23]

    注意点:

    1. 因为生成器就是等到用的(比如:打印或者next函数取值等)时候才会进行计算生成,所以等到最后打印的时候才开始计算(即在本程序最后一步的时候才开始计算),而之前所做的循环都是把表达式进行了计算,并没有真的代入数值进行计算。
    2. 当开始计算数据的时候,循环已经进行了两次,两次后n的值也因此变成了10 
  • 相关阅读:
    中美贸易战再次开启,世界两极化进程正在加快形成!..... Copyright: 1688澳洲新闻网 Read more at: https://www.1688.com.au/world/international/2018/06/17/369368/
    缠师的博客中关于舒伯特中的回帖,细思极恐
    南怀瑾,脱了国学大师的外衣,只剩下江湖和名利
    你可能修了一个假的“不净观”
    陈大惠老师:什么叫道德?
    C#-正则,常用几种数据解析-端午快乐
    html5+go+websocket简单实例代码
    Task三个列子的分享
    golang-web框架revel一个表单提交的总结
    百度流行音乐-资源数据整合
  • 原文地址:https://www.cnblogs.com/sunshine2017/p/12498835.html
Copyright © 2020-2023  润新知