Python基础教程:内置类型之生成器
生成器的定义方式有两种
- 一种是调用生成器函数
- 一种是使用生成器表达式语法
调用生成器函数
生成器函数是指在函数体中使用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基础教程:内置类型之生成器相关推荐
- python即时标记_【Python】读书笔记:Python基础教程-项目1-即时标记
功能:给文本添加HTML标记,使得到的文档能够在浏览器中显示并能作为一个网页使用. 要求: 输入不应包含人工代码或标签: 应能处理不同的块,比如标题.段落.列表项.内嵌文本(比如被强调的文本.URL等 ...
- Python基础教程书籍案例:新闻采集(新闻聚合)【上】
这个练习项目来自<Python基础教程(第2版)>,案例原名为"新闻聚合". 项目分为两个阶段: 第一阶段:通过与NNTP服务器进行交互获取新闻源. 第二阶段:获取不同 ...
- 视频教程-快速入门Python基础教程_Python基础知识大全-Python
快速入门Python基础教程_Python基础知识大全 十余年计算机技术领域从业经验,在中国电信.盛大游戏等多家五百强企业任职技术开发指导顾问,国内IT技术发展奠基人之一. 杨千锋 ¥99.00 立即 ...
- Python基础教程,Python入门教程
Python 是一门上手简单.功能强大.通用型的脚本编程语言.Python 类库极其丰富,这使得 Python 几乎无所不能,网站开发.软件开发.大数据分析.网络爬虫.机器学习等都不在话下. 这套 P ...
- 【Python】读书笔记:Python基础教程-项目1-即时标记
功能:给文本添加HTML标记,使得到的文档能够在浏览器中显示并能作为一个网页使用. 要求: 输入不应包含人工代码或标签: 应能处理不同的块,比如标题.段落.列表项.内嵌文本(比如被强调的文本.URL等 ...
- 《Python基础教程》学习笔记——条件、循环及其他语句
Python基础教程--条件.循环及其他语句 条件.循环及其他语句 再谈 print 和 import 打印多个参数 导入时重命名 赋值魔法 序列解包 链式赋值 增强赋值 代码块:缩进的乐趣 条件和条 ...
- python基础教程(第3版) pdf,python手册中文版第四版
求<Python学习手册>(第四版)中文版pdf,万分感谢! <[3]学习视频>百度网盘资源免费下载链接提取码:m6tm[3]学习视频|python视频教程|Python入门基 ...
- Python 基础教程(第二版)读书笔记
Python 基础教程(第二版) 第一章 在 Python 3 中可直接使用长整数,而不必添加 L 或者 l 的后缀. print在 Python 3 中是函数. 在交互式解释器中使用 if 语句,需 ...
- Python基础教程,Python神仙级入门教程(非常详细)
Python 是一门开源免费.通用型的脚本编程语言,它上手简单,功能强大,坚持「极简主义」. Python 类库(模块)极其丰富,这使得 Python 几乎无所不能,不管是传统的 Web 开发.PC ...
- python基础教程 pdf github_Python极速入门的多本最佳书籍,不可错过的Python学习资料...
Python作为现在很热门的一门编程语言,介于Python的友好,许多的初学者都将其作为首选,为了帮助大家更好的学习Python,我筛选了2年内优秀的python书籍,个别经典的书籍扩展到5年内. p ...
最新文章
- 重磅直播|结构光方法新应用
- python如何调用图片-python实现读取并显示图片的两种方法
- (十)Java B2B2C o2o多用户商城 springcloud架构- SSO单点登录之OAuth2.0登录认证(1)
- java float 转double_将float转换为double而不会丢失精度
- Intermission
- yii2增删改查及AR的理解
- excel取整函数_查询函数Choose、Lookup、Hlookup、Vlookup应用技巧解读
- android Camera 中的相关概念
- 手游:cocos2d-x3.0 移植 wp8 开发 各种 “蛋疼”问题的汇总
- PHP-Smarty
- 三轴加速度传感器的驱动编程
- 华为4月11号 南研所 面经。(已拿offer)
- DataBase培训
- 解决MySQL远程过程调用失败
- 移动最小二乘法(MLS)曲线曲面拟合C++代码实现
- 阿里实习生内推电面总结
- 《中国式斗争:一贴省你二十年》
- 【Spark ML】第 4 章:无监督学习
- 2021年考Java工程师的要求有哪些?
- 制作gif动态图片,使用哪款软件,经验分享