zoukankan      html  css  js  c++  java
  • day0321 生成器

    一.生成器

    1.迭代器:

      1.1.调用方法直接返回

      1.2.可迭代对象通过执行iter方法得到

    迭代器的优势:节省内存。

    2.生成器:有些情况我们也需要也需要节省空间,只能是自己写来实现迭代器的功能就是生成器

    3.python中提供生成器:

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

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

    4.生成器Generator:

      本质:迭代器(所以自带__iter__,__next__方法,不需要我们去实现)
      特点:惰性运算,开发者自定义。

    5.生成器函数:

      一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。

    import time
    def fun():
        a=1
        print('定义一个a变量;')
        yield a
        b=2
        print('定义一个b变量;')
        yield b
    g=fun()
    print('g:',g)           #返回一个生成器
    print('_'*20)           #分隔线
    print(next(g))
    time.sleep(2)           #sleep两秒看清过程
    print(next(g))
    
    结果:
    g: <generator object fun at 0x000001381CD65A98>
    ____________________
    定义一个a变量;
    1
    定义一个b变量;
    2
    

    6.列表推导式和生成器表达式

    #老男孩由于峰哥的强势加盟很快走上了上市之路,alex思来想去决定下几个鸡蛋来报答峰哥
    
    egg_list=['鸡蛋%s' %i for i in range(10)] #列表解析
    
    #峰哥瞅着alex下的一筐鸡蛋,捂住了鼻子,说了句:哥,你还是给我只母鸡吧,我自己回家下
    
    laomuji=('鸡蛋%s' %i for i in range(10))#生成器表达式
    print(laomuji)
    print(next(laomuji)) #next本质就是调用__next__
    print(laomuji.__next__())
    print(next(laomuji))
    print(egg_list)
    结果:
    <generator object <genexpr> at 0x00000174827359E8>
    鸡蛋0
    鸡蛋1
    鸡蛋2
    ['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
    

      

    总结:

    1.把列表解析的[]换成()得到的就是生成器表达式

    2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存

    3.Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和:

    sum(x ** 2 for x in range(4))
    而不用多此一举的先构造一个列表:
    sum([x ** 2 for x in range(4)])
  • 相关阅读:
    特殊类
    Statement和PrepareStatement有什么区别?
    关于${pageContext.request.contextPath }对于工程中的那个目录
    IDEA JSP中报错cannot resolve method println的解决方案
    关于${pageContext.request.contextPath}的理解
    IDEA中引用不到HttpServlet的解决方案
    Serializable接口的意义和用法
    idea Cannot resolve method (最新2020解决办法)
    IDEA Artifacts:Error during artifact deployment问题解决(狂神SSM整合里,报404错误方案)
    IDEA设置自动导入包方法
  • 原文地址:https://www.cnblogs.com/Zhao159461/p/10575653.html
Copyright © 2011-2022 走看看