前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >详解Python中的生成器表达式(generator expression)

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

作者头像
Python小屋屋主
发布2018-04-16 15:13:35
1K0
发布2018-04-16 15:13:35
举报
文章被收录于专栏:Python小屋Python小屋

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

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

#创建生成器对象

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

>>> g

<generator object <genexpr> 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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档