生成器的定义方式有两种

  • 一种是调用生成器函数
  • 一种是使用生成器表达式语法

调用生成器函数

生成器函数是指在函数体中使用yield表达式仅返回结果的函数。yield表达式仅在定义生成器函数时使用,因此只能用在函数定义的主体中。在函数体中使用yield表达式会使该函数成为生成器函数。当生成器函数被调用时,它返回一个称为生成器的迭代器,该迭代器由python自动生成。

然后,生成器控制了生成器函数的执行。因为返回的生成器是一个迭代器,所以生成器函数的执行结果也就可以被循环。当生成器的的__next__方法被调用时,生成器函数的函数体内的语句开始执行,执行进行到第一个yield表达式时,立即将yield表达式的结果返回给生成器的调用者,同时将生成器函数内部的状态挂起。

即保持生成器函数的执行进度,和生成器函数内的局部状态:包括局部变量的当前绑定,指令指针,内部计算栈和任何异常处理的状态。当生成器的再次调用__next__方法来时,生成器函数恢复执行,并再次执行到yield表达式返回结果再保持状态,直到无法再执行到yield表达式。此时生成器自动抛出StopIteration异常。

我们先定义一个简单生成器函数,函数功能返回数字0-9的平方数

# 生成器函数,功能返回数字0-9的平方数
>>> def squares():for i in range(10):yield i**2# 使用return关键字是普通函数,使用yield关键字函数变成了生成器函数

使用参数g接收调用生成器函数squares的结果,然后分别在shell查看squares和g这两个变量的类型

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> g = squares()#查看squares对象类型
>>> squares
<function squares at 0x035950C0>#查看g对象类型
>>> g
<generator object squares at 0x0358A930>

从上面可以看出变量squares是函数类型,变量g是generator类型对象,generator从字面的理解上就是生成器类型。

根据上一节迭代器中提到的知识,从collection模块引入Iterator的抽象基类,验证下generator类型是不是上面说的迭代器类型。

>>> from collections import Iterator
>>> isinstance(g,Iterator)
True

验证成功,说明生成器函数的执行结果确实是生成器,一种特殊的迭代器。

>>> for i in g:print (i)0
1
4
9
16
25
36
49
64
81

生成器表达式

除了使用生成器函数可以得到生成器,还可以生成器表达式得到生成器表达式。

生成器表达式本身看起来像列表推到, 但不是用方括号而是用圆括号包围起来:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> g2 = (x**2 for x in range(10))
>>> g2
<generator object <genexpr> at 0x0359AFC0>>>> t = (1,2,3,4,5)
>>> g3 = (x**2 for x in t)
>>> g3
<generator object <genexpr> at 0x007F6180>

验证:

>>> isinstance(g2,Iterator)
True>>> isinstance(g3,Iterator)
True

使用:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> for i in g2:print(i)0
1
4
9
16
25
36
49
64
81>>> for i in g3:print(i)1
4
9
16
25

和普通迭代器相比,生成器不单简化了迭代器的定义,还在使用效率上有提升。因为生成器在循环时,生成器函数每次只会返回一个结果,然后保持内部状态,所以生成器占用的内存是很小的。

以下两个测试结果,第一个直接抛出MemoryError异常,第二个只能正确计算出结果。

# 全部数据先加载在1个列表上面,内存占用高
>>> s1 = sum([i for i in range(100000000)])
Traceback (most recent call last):File "<pyshell#6>", line 1, in <module>s1 = sum([i for i in range(100000000)])File "<pyshell#6>", line 1, in <listcomp>s1 = sum([i for i in range(100000000)])
MemoryError# 数据几乎不占内存
>>> s2 = sum((i for i in range(100000000)))
>>> s2
4999999950000000

Python基础教程:内置类型之生成器相关推荐

  1. python即时标记_【Python】读书笔记:Python基础教程-项目1-即时标记

    功能:给文本添加HTML标记,使得到的文档能够在浏览器中显示并能作为一个网页使用. 要求: 输入不应包含人工代码或标签: 应能处理不同的块,比如标题.段落.列表项.内嵌文本(比如被强调的文本.URL等 ...

  2. Python基础教程书籍案例:新闻采集(新闻聚合)【上】

    这个练习项目来自<Python基础教程(第2版)>,案例原名为"新闻聚合". 项目分为两个阶段: 第一阶段:通过与NNTP服务器进行交互获取新闻源. 第二阶段:获取不同 ...

  3. 视频教程-快速入门Python基础教程_Python基础知识大全-Python

    快速入门Python基础教程_Python基础知识大全 十余年计算机技术领域从业经验,在中国电信.盛大游戏等多家五百强企业任职技术开发指导顾问,国内IT技术发展奠基人之一. 杨千锋 ¥99.00 立即 ...

  4. Python基础教程,Python入门教程

    Python 是一门上手简单.功能强大.通用型的脚本编程语言.Python 类库极其丰富,这使得 Python 几乎无所不能,网站开发.软件开发.大数据分析.网络爬虫.机器学习等都不在话下. 这套 P ...

  5. 【Python】读书笔记:Python基础教程-项目1-即时标记

    功能:给文本添加HTML标记,使得到的文档能够在浏览器中显示并能作为一个网页使用. 要求: 输入不应包含人工代码或标签: 应能处理不同的块,比如标题.段落.列表项.内嵌文本(比如被强调的文本.URL等 ...

  6. 《Python基础教程》学习笔记——条件、循环及其他语句

    Python基础教程--条件.循环及其他语句 条件.循环及其他语句 再谈 print 和 import 打印多个参数 导入时重命名 赋值魔法 序列解包 链式赋值 增强赋值 代码块:缩进的乐趣 条件和条 ...

  7. python基础教程(第3版) pdf,python手册中文版第四版

    求<Python学习手册>(第四版)中文版pdf,万分感谢! <[3]学习视频>百度网盘资源免费下载链接提取码:m6tm[3]学习视频|python视频教程|Python入门基 ...

  8. Python 基础教程(第二版)读书笔记

    Python 基础教程(第二版) 第一章 在 Python 3 中可直接使用长整数,而不必添加 L 或者 l 的后缀. print在 Python 3 中是函数. 在交互式解释器中使用 if 语句,需 ...

  9. Python基础教程,Python神仙级入门教程(非常详细)

    Python 是一门开源免费.通用型的脚本编程语言,它上手简单,功能强大,坚持「极简主义」. Python 类库(模块)极其丰富,这使得 Python 几乎无所不能,不管是传统的 Web 开发.PC ...

  10. python基础教程 pdf github_Python极速入门的多本最佳书籍,不可错过的Python学习资料...

    Python作为现在很热门的一门编程语言,介于Python的友好,许多的初学者都将其作为首选,为了帮助大家更好的学习Python,我筛选了2年内优秀的python书籍,个别经典的书籍扩展到5年内. p ...

最新文章

  1. 重磅直播|结构光方法新应用
  2. python如何调用图片-python实现读取并显示图片的两种方法
  3. (十)Java B2B2C o2o多用户商城 springcloud架构- SSO单点登录之OAuth2.0登录认证(1)
  4. java float 转double_将float转换为double而不会丢失精度
  5. Intermission
  6. yii2增删改查及AR的理解
  7. excel取整函数_查询函数Choose、Lookup、Hlookup、Vlookup应用技巧解读
  8. android Camera 中的相关概念
  9. 手游:cocos2d-x3.0 移植 wp8 开发 各种 “蛋疼”问题的汇总
  10. PHP-Smarty
  11. 三轴加速度传感器的驱动编程
  12. 华为4月11号 南研所 面经。(已拿offer)
  13. DataBase培训
  14. 解决MySQL远程过程调用失败
  15. 移动最小二乘法(MLS)曲线曲面拟合C++代码实现
  16. 阿里实习生内推电面总结
  17. 《中国式斗争:一贴省你二十年》
  18. 【Spark ML】第 4 章:无监督学习
  19. 2021年考Java工程师的要求有哪些?
  20. 制作gif动态图片,使用哪款软件,经验分享

热门文章

  1. 2018中国互联网企业100强揭晓!阿里巴巴名列榜首
  2. jquery 的ajax请求示例和注意事项
  3. 【Linux基础】 diff命令的参数详解和实例
  4. SAP SOAMANAGER报错原因与故障排除方法
  5. 事务RFC(TRFC)原理和实战解析
  6. ABAP ALV 颜色设置(行,列,单元格)
  7. POJO和javabean的异同
  8. SAP SD 条件技术
  9. SAP:HANA为高性能数据分析保驾护航
  10. ALV中调用Excel, 丢掉前面的0问题解决