zoukankan      html  css  js  c++  java
  • python学习——生成器表达式

    深坑:生成器要值的时候才会拿

     

    tu = (i for i in range(10))  #没有元组推导式,只有生成器表达式

    print(tu)

    print(tu.__next__())

    =============================================

    推导式和生成器的区别示例

    lst = [i for i in range(10) ]  #列表

    print(lst)

    gen = (i for i in range(10))  #生成器,惰性机制*

    print(gen.__next__())

    ==================================

    生成器函数

    def func():

      print(111)

      yield 222

      yield 333

    ++++++++++++++++++++++

    第一种情况

    g = func()  #获取生成器

    g1 = (i for i in g)  #生成器

    g2 = (i for i in g1)  #生成器

    print(list(g))  #打印的是[222,333],源头,从源头把数据拿走了

    print(list(g1))  #打印的是[ ],这里执行的时候,源头已经没有数据了

    print(lsint(g2))  #打印的是[ ],如果把这个print放到前两个print之前,那么222,333在这个print对应的跟g2中,g、g1为[ ]

    ++++++++++++++++++++++++++++

    第二种情况

    g = func()  #获取生成器

    g1 = (i for i in g)  #生成器

    g3 = func()  #获取生成器

    g2 = (i for i in g3)  #生成器

    print(list(g))  #打印的是[222,333],源头,从源头把数据拿走了

    print(list(g1))  #打印的是[ ],这里执行的时候,源头已经没有数据了

    print(lsint(g2))  #打印为[222,333],因为g3 跟g是两个没有关系的生成器,所以有值

    ===============================================================

    #求和

    def add(a,b):

      return a+b

    #生成器函数,返回的结果为0~3

    def test():

      for r_i in range(4):  #0,1,2,3

        yield r_i

    g = test()  #0,1,2,3

    @n = 2  #n = 2此时没有从生成器中拿值,

    @g = (add(n,i) for i in g)

    @n = 10  #n = 10 时因为

    @g = (add(n,i) for i in (add(n,i) for i in g))

    #惰性机制

    ###for n in [2,10]:  #将带###的2句,直译为带@的4句中的两次遍历

      ###g = (add(n,i) for i in g)  #这里虽然遍历了两次[2,10]列表,但是只有遍历的过程,没有计算,最后一次遍历的时候要求打印list(g),由于惰性机制只有在要求计算结果的时候n=10,才会从生成器中取值g=(0,1,2,3)然后带入多次循环语句g = (add(n,i) for i in (add(n,i) for i in g))中,按照n=10这一要求计算之前n的取值结果,自后先前依次计算。

    print(list(g))

  • 相关阅读:
    tornado用户指引(三)------tornado协程使用和原理(二)
    利用tornado使请求实现异步非阻塞
    在tornado中使用异步mysql操作
    Tornado 线程池应用
    Tornado异步与延迟任务
    tornado用户指引(二)------------tornado协程实现原理和使用(一)
    Tornado用户指引(一)-----------异步和非阻塞I/O
    Tornado异步之-协程与回调
    Python核心框架tornado的异步协程的2种方式
    c++ Map使用
  • 原文地址:https://www.cnblogs.com/bilx/p/11327675.html
Copyright © 2011-2022 走看看