生成器表达式(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

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

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

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

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

详解Python中的生成器表达式(generator expression)相关推荐

  1. python的装饰器迭代器与生成器_详解python中的生成器、迭代器、闭包、装饰器

    迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 1|1可迭代对象 以直接作用于 for ...

  2. python 协程可以嵌套协程吗_Python | 详解Python中的协程,为什么说它的底层是生成器?...

    今天是Python专题的第26篇文章,我们来聊聊Python当中的协程. 我们曾经在golang关于goroutine的文章当中简单介绍过协程的概念,我们再来简单review一下.协程又称为是微线程, ...

  3. python3 yield 大文件_详解Python3中yield生成器的用法

    任何使用yield的函数都称之为生成器,如: def count(n): while n > 0: yield n #生成值:n n -= 1 另外一种说法:生成器就是一个返回迭代器的函数,与普 ...

  4. 详解Python3中yield生成器的用法

    这篇文章主要介绍了详解Python3中yield生成器的用法,是Python入门学习中的基础知识,需要的朋友可以参考下 任何使用yield的函数都称之为生成器,如: def count(n):whil ...

  5. [转载] python中for语句用法_详解Python中for循环的使用_python

    参考链接: 在Python中将else条件语句与for循环一起使用 这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 &q ...

  6. python中for语句用法_详解Python中for循环的使用_python

    这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 "探索 Python,第 5 部分:用 Python 编程&q ...

  7. python操作目录_详解python中的文件与目录操作

    详解python中的文件与目录操作 一 获得当前路径 1.代码1 >>>import os >>>print('Current directory is ',os. ...

  8. python open 打开是什么类型的文件-详解Python中open()函数指定文件打开方式的用法...

    文件打开方式 当我们用open()函数去打开文件的时候,有好几种打开的模式. 'r'->只读 'w'->只写,文件已存在则清空,不存在则创建. 'a'->追加,写到文件末尾 'b'- ...

  9. python中list[1啥意思_详解Python中list[::-1]的几种用法

    本文主要介绍了Python中list[::-1]的几种用法,分享给大家,具体如下: s = "abcde" list的[]中有三个参数,用冒号分割 list[param1:para ...

最新文章

  1. 中国大陆开源镜像站汇总
  2. linux应用程序开发数据,《嵌入式linux应用程序开发详解》核心笔记
  3. vue-cli-service 不是内部或者外部命令的解决办法(用了你就知道了)
  4. 15.4.2:可变参数与泛型化方法
  5. office自定义安装选项_如何自定义Office 2013中功能区上的现有选项卡
  6. 前端学习(1715):前端系列javascript之页面配置
  7. oh-my-zsh扫描git仓库卡慢的解决方法
  8. java实现蛇蛇大作战_蛇蛇大作战3D旋涡版
  9. 05-netty小例子
  10. linux so库反编译命令,使用IDA反编译.so文件并修改
  11. 53.创建线程_beginthread
  12. Python爬取手机号码前7位号段归属地及运营商
  13. Office 2007免序列号安装的ISO制作方法
  14. Linux 查看磁盘空间命令
  15. 车牌号正则校验(新能源)
  16. 搜索结果排列html模板,搜索结果页优化-城市模板
  17. 安全领域知识图谱建设与典型应用场景
  18. Halcon 2D图像转3D效果查看
  19. 如何活跃社群,提高转化
  20. 清华大学王观堂先生纪念碑铭----陈寅恪

热门文章

  1. python编译为机器码_通过 GraalVM 将 Java 程序编译成本地机器码!
  2. 丹佛斯变频器型号说明_台达变频器VFD-CH2000型号说明及功能介绍
  3. c语言求最后一个单词的长度,试题2:计算字符串最后一个单词的长度
  4. oracle 批量给字段加注释,Oracle给表和字段添加注释
  5. 修改js版本_啥都学点之使用nvm安装Node.js并实现Node.js多版本管理
  6. java 阿里线程池_为什么阿里不允许使用 Executors 创建线程池?
  7. 同等质量下那种图片格式小_最实用的Window小工具合集,总有一款适合你!
  8. oracle数据库通过SQL profile 绑定SQL最优执行计划(个人实践)
  9. RMAN 目录管理维护
  10. 带你入门SpringCloud 之 通过SpringCloud Bus 自动更新配置