• 详解Python中的生成器表达式(generator expression)


      

      介绍

        1、生成器表达式(generator expression)也叫生成器推导式或生成器解析式,用法与列表推导式非常相似,在形式上生成器推导式使用圆括号(parentheses)作为定界符,而不是列表推导式所使用的方括号(square brackets)。

        2、与列表推导式最大的不同是,生成器推导式的结果是一个生成器对象。生成器对象类似于迭代器对象,具有惰性求值的特点,只在需要时生成新元素,比列表推导式具有更高的效率,空间占用非常少,尤其适合大数据处理的场合。

        3、使用生成器对象的元素时,可以根据需要将其转化为列表或元组,也可以使用生成器对象的next()方法或者内置函数next()进行遍历,或者直接使用for循环来遍历其中的元素。但是不管用哪种方法访问其元素,

          只能从前往后正向访问每个元素,不能再次访问

        4、已访问过的元素,也不支持使用下标访问其中的元素。当所有元素访问结束以后,如果需要重新访问其中的元素,必须重新创建该生成器对象,enumerate、filter、map、zip等其他迭代器对象也具有同样的特点。

      

      

    #1、创建生成器对象
    g = ((i+2)**2 for i in range(10))
    print g
    #<generator object <genexpr> at 0x0000000003517798>
    
    #2、将生成器对象转换为元组
    a = tuple(g)
    print a
    #(4, 9, 16, 25, 36, 49, 64, 81, 100, 121)
    
    #3、生成器对象已遍历结束,没有元素了
    print list(g)
    #[]
    
    #4、重新创建生成器对象
    g = ((i+2)**2 for i in range(10))
    
    #5、使用生成器对象的next()方法获取元素
    print g.next()
    # 4
    print g.next()
    # 9
    
    # 6、使用函数next()获取生成器对象中的元素
    print next(g)
    # 16
    
    g = ((i+2)**2 for i in range(10))
    
    #7、使用循环直接遍历生成器对象中的元素
    for item in g:
        print item
    
    #8、 filter对象也具有类似的特点
    x = filter(None, range(20))
    print x
    # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
    
    
    #9、map对象也具有类似的特点
    x = map(str, range(20))
    print x
    # ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19']
  • 相关阅读:
    【CCPC2020网络赛11】Convolution
    【CCPC2020网络赛02】Graph Theory Class
    全国中学生网安竞赛出题总结
    XDU2020ACM校赛总结
    CTF错误集合
    【洛谷2916】图的遍历
    20200420(ABC)题解 by 辛晓东
    20200402(ABC)题解 by 孙晨曦
    20200406(ABC)题解 by 徐光旭
    20200407(DE)题解 by 孙晨曦
  • 原文地址:https://www.cnblogs.com/shaosks/p/7084748.html
Copyright © 2020-2023  润新知