Python从入门到实践:函数之生成器
目录
一、yield关键字
二、yield表达式的应用
三、三元表达式、列表生成式、生成器表达式
3.1三元表达式
3.2列表生成式
3.3生成器表达式
一、yield关键字
若函数体包含yield关键字,再调用函数,并不会执行函数体代码,得到的返回值即生成器对象
>>> def my_range(start,stop,step=1):
... print('start...')
... while start < stop:
... yield start
... start+=step
... print('end...')
...
>>> g=my_range(0,3)
>>> g
<generator object my_range at 0x104105678>
生成器内置有_iter_和_next_方法,所以生成器本身就是一个选代器
>>> g.__iter__
<method-wrapper '__iter__' of generator object at 0x1037d2af0>
>>> g.__next__
<method-wrapper '__next__' of generator object at 0x1037d2af0>
>>> next(g) # 触发函数执行直到遇到yield则停止,将yield后的值返回,并在当前位置挂起函数
start...
0
>>> next(g) # 再次调用next(g),函数从上次暂停的位置继续执行,直到重新遇到yield...
1
>>> next(g) # 周而复始...
2
>>> next(g) # 触发函数执行没有遇到yield则无值返回,即取值完毕抛出异常结束迭代
end...
Traceback (most recent call last):File "<stdin>", line 1, in <module>
StopIteration
既然生成器对象属于迭代器,那么必然可以使用for循环选代,如下:
有了yield关键字,我们就有了一种自定义选代器的实现方式。yield可以用于返回值,但不同于return,函数一旦遇到return就结束了,而yield可以保存函数的运行状态挂起函数,用来返回多次值
二、yield表达式的应用
在函数内可以采用表达式形式的yield
>>> def eater():
... print('Ready to eat')
... while True:
... food=yield
... print('get the food: %s, and start to eat' %food)
...
可以拿到函数的生成器对象持续为函数体send值,如下
>>> g=eater() # 得到生成器对象
>>> g
<generator object eater at 0x101b6e2b0>
>>> next(g) # 需要事先”初始化”一次,让函数挂起在food=yield,等待调用g.send()方法为其传值
Ready to eat
>>> g.send('包子')
get the food: 包子, and start to eat
>>> g.send('鸡腿')
get the food: 鸡腿, and start to eat
针对表达式形式的yield,生成器对象必须事先被初始化一次,让函数挂起在food=yield的位置,等待调用g.send0方法为函数体传值,g.send(None)等同于next(g)。
我们可以编写装饰器来完成为所有表达式形式yield对应生成器的初始化操作,如下
def init(func):def wrapper(*args,**kwargs):g=func(*args,**kwargs) #得到生成器(不会立刻有返回值)next(g)return greturn wrapper@init
def eater():print('Ready to eat')while True:food=yieldprint('get the food: %s, and start to eat' %food)
表达式形式的yield也可以用于返回多次值,即变量名=yield值的形式,如下
>>> def eater():
... print('Ready to eat')
... food_list=[]
... while True:
... food=yield food_list
... food_list.append(food)
...
>>> e=eater()
>>> next(e)
Ready to eat
[]
>>> e.send('蒸羊羔')
['蒸羊羔']
>>> e.send('蒸熊掌')
['蒸羊羔', '蒸熊掌']
>>> e.send('蒸鹿尾儿')
['蒸羊羔', '蒸熊掌', '蒸鹿尾儿']
三、三元表达式、列表生成式、生成器表达式
3.1三元表达式
res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值
3.2列表生成式
当然,除了列表,还有字典,注意,()生成的不是元祖,而是生成器!
egg_list=['鸡蛋%s' %i for i in range(10)]
3.3生成器表达式
创建一个生成器对象有两种方式,一种是调用带yield关键字的函数,另一种就是生成器表达式,与列表生成式的语法格式相同,只需要将口换成(),即:
>>> [x*x for x in range(3)]
[0, 1, 4]
>>> g=(x*x for x in range(3))
>>> g
<generator object <genexpr> at 0x101be0ba0>
对比列表生成式,生成器表达式的优点自然是节省内存(一次只产生一个值在内存中)!
>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g) #抛出异常StopIteration
如果我们要读取一个大文件的字节数,应该基于生成器表达式的方式完成
with open('db.txt','rb') as f:nums=(len(line) for line in f)total_size=sum(nums) # 依次执行next(nums),然后累加到一起得到结果=
Python从入门到实践:函数之生成器相关推荐
- 董老师又双叒叕送书啦,10本《Python程序设计入门与实践》
活动详情: 在本文文末留言,留言获得点赞. 自本文推送之时活动立即生效,当天2月20日晚上21:00结束,获赞最多的前10条留言,每人获赠一本书. 2月20日晚上21:01在本文文末置顶留言公布获奖名 ...
- 新书推荐--《Python程序设计入门与实践》
过完春节快递小哥们上班以后,公众号会连续送几波书,敬请留意! 书名:Python程序设计入门与实践 ISBN:978-7-5606-5960-2 作者:董付国 页数:319页 例题数量:73例 演示代 ...
- python从入门到实践和从入门到精通-Python从入门到实践之列表|第1天
User:你好我是森林 Date:2018-02-14 Mark:<Python从入门到实践> 列表 本章主要从列表的概念入手,逐步深入到对列表的操作. 列表 概念 列表由一系列按特定顺序 ...
- Python数据挖掘入门与实践-OneR分类算法
Python数据挖掘入门与实践-OneR分类算法 OneR算法 OneR算法是根据已有的数据中,具有相同特征值的个体最可能属于哪个类别进行分类. 在本例中,只需选区Iris是个特征中分类效果最好的一个 ...
- Python从入门到实践
Python从入门到实践 文章目录 Python从入门到实践 第2章 变量和简单的数据类型 2.2 变量的命名规则 2.3 字符串 2.4 数字 1.整数 2.浮点数 3.使用str( )避免类型错误 ...
- python从入门到实践19章答案
目录 前言 一.博客 1.建立项目 2.创建应用程序 3.Django管理网站 4.让用户输入数据 二.博客账户 1.应用程序users 2.登录页面 3.注销 4.注册页面 三.重构 四.保护页面n ...
- python从入门到实践18章答案
目录 前言 一.新项目 二.简短的条目 三.Django API 四.比萨店 1.创建虚拟环境.安装Django.创建项目.创建数据库.创建应用程序 2.定义模型 3.激活模型 4.向管理网站注册模型 ...
- 《Python从入门到实践》读书笔记——第六章 字典
<Python从入门到实践>读书笔记--第六章 字典 1. 一个简单的字典 alien_0 = {'color': 'green', 'points': 5}print(alien_0[' ...
- 《python数据挖掘》和《python数据挖掘入门与实践》两本书读后感
这些天花了很多时间来学习数据挖掘这门课程,有很多心得和感悟,所以写下这篇博客来表达自己读完这两本书的感受! 首先推荐大家通过这两本书来入门数据挖掘这个领域,python数据挖掘这本书较容易,还花了很大 ...
- Python从入门到实践习题答案(第九章 类)
在学习<Python从入门到实践>,代码是自己编写的噢(虽然有些代码有参考其他大佬),点个赞再走8~ 9-1 餐馆:创建一个名为 Restaurant 的类,其方法__init__()设置 ...
最新文章
- python项目归纳总结-python项目总结
- 海淘会不会成为电商的下一片蓝海?
- 根据不同地区的名称显示不同的页面
- HTMLCSS编码规范
- wireshark 过滤法则
- 关于cell中添加子视图 复用重叠问题的解决方法
- 【BlackHat】黑帽大会上值得关注的安全工具
- FCN论文-语义分割
- R与Python手牵手:数据探索性分析案例展示
- 国内大公司的开源项目一览表(包含mysql读写分离等)
- 未来真的可以影响过去吗?人人都能看懂的波粒二象性和延迟选择量子擦除实验解释,通俗易懂量子物理
- codeforces C. Team
- php 0改成百 千_php 根据啊拉伯数字转变成大写中文数字
- mid360激光雷达跑Point-LIO算法
- 《IT老外在中国》第29期:这位美籍华裔兜兜转转又回到了心心念念的故乡
- Very Good!!! - React 入门实例教程
- 搞了一个论坛玩玩!http://lupeiqing.3322.org/bbs
- 小程序组件Painter的使用心得
- 计算机物联网知识,计算机科学技术对物联网的5大作用分析
- android锁屏应用系统排行榜,重塑安卓手机的20大锁屏应用程序