社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Python小屋 • 9 年前 • 705 次点击  

生成器表达式(generator expression)也叫生成器推导式或生成器解析式,用法与列表推导式非常相似,在形式上生成器推导式使用圆括号(parentheses)作为定界符,而不是列表推导式所使用的方括号(square brackets)。与列表推导式最大的不同是,生成器推导式的结果是一个生成器对象。生成器对象类似于迭代器对象,具有惰性求值的特点,只在需要时生成新元素,比列表推导式具有更高的效率,空间占用非常少,尤其适合大数据处理的场合。

使用生成器对象的元素时,可以根据需要将其转化为列表或元组,也可以使用生成器对象的__next__()方法或者内置函数next()进行遍历,或者直接使用for循环来遍历其中的元素。但是不管用哪种方法访问其元素,只能从前往后正向访问每个元素,不能再次访问已访问过的元素,也不支持使用下标访问其中的元素。当所有元素访问结束以后,如果需要重新访问其中的元素,必须重新创建该生成器对象,enumerate、filter、map、zip等其他迭代器对象也具有同样的特点。

#创建生成器对象

>>> g = ((i+2)**2 for i in range(10))

>>> g

at 0x0000000003095200>

#将生成器对象转换为元组

>>> tuple(g)

(4, 9, 16, 25, 36, 49, 64, 81, 100, 121)

#生成器对象已遍历结束,没有元素了

>>> list(g)

[]

#重新创建生成器对象

>>> g = ((i+2)**2 for i in range(10))

#使用生成器对象的__next__()方法获取元素

>>> g.__next__()

4

#获取下一个元素

>>> g.__next__()

9

#使用函数next()获取生成器对象中的元素

>>> next(g)

16

>>> g = ((i+2)**2 for i in range(10))

#使用循环直接遍历生成器对象中的元素

>>> for item in g:

    print(item, end=' ')

4 9 16 25 36 49 64 81 100 121

#filter对象也具有类似的特点

>>> x = filter(None, range(20))

>>> 1 in x

True

>>> 5 in x

True

#不可再次访问已访问过的元素

>>> 2 in x

False

#map对象也具有类似的特点

>>> x = map(str, range(20))

>>> '0' in x

True

#不可再次访问已访问过的元素

>>> '0' in x

False

与列表推导式不同,当生成器推导式中包含多个for语句时,在创建生成器对象时只对第一个for语句进行检查和计算,在调用内置函数next()或生成器对象的__next__()方法获取值的时候才会检查和计算其他for语句。


>>> [x*y for x in range(3) for z in range(5)]

NameError: name 'y' is not defined

>>> g = (x*y for x in range(3) for z in range(5))

#第二个for语句有问题,抛出异常

>>> next(g)

NameError: name 'y' is not defined

最后,如果生成器推导式作为单参数函数时,可以省略两侧的圆括号。例如

>>> sum(x for x in range(3))

3



--------------我是分割线-------------

“Python小屋”公众号近期主要活动:

1、赠书活动:详情请进入公众号以后通过菜单“最新资源”===>“历史文章分类表”进行查看

2、Python师资培训班:8月6日-12日,济南,面向全国高校老师和企业朋友,通知详见关于举办2017年暑期全国高校教师 “Python编程及应用”培训班通知


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/2AeLdOhzHm
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/2411