深入浅析Python中的yield关键字


Posted in Python onJanuary 24, 2018

前言

python中有一个非常有用的语法叫做生成器,所利用到的关键字就是yield。有效利用生成器这个工具可以有效地节约系统资源,避免不必要的内存占用。

一段代码

def fun():
for i in range(20):
 x=yield i
 print('good',x)
if __name__ == '__main__':
a=fun()
a.__next__()
x=a.send(5)
print(x)

这段代码很短,但是诠释了yield关键字的核心用法,即逐个生成。在这里获取了两个生成器产生的值,即0和1。分别由next函数和send()函数获得,这两个函数的区别我们后面会详细阐述。

关于__next__函数,这里先说明一下,我们可以利用__next__()这个函数持续获取符合fun函数规则的数,直到19结束。这段代码如下所示:

def fun():
for i in range(20):
 x=yield i
if __name__ == '__main__':
for x in fun():
 print(x)

这段代码的效果和下面这段代码是完全相同的

if __name__ == '__main__':
for i in range(20):
 x=yield i

for..in调用生成器算是生成器的基础用法,不过只会用for..in意义是不大的。生成器中最重要的函数是sent和__next__这两个函数,下面就针对这两个函数进行详细的阐述。

sent函数

这里特别强调了sent函数,因为sent函数没有那么直观。__next__函数很好理解,就是从上一个终止点开始,到下一个yield结束,返回值就是yield表达式的值。

例如在初始的那段代码里:

def fun():
for i in range(20):
 x=yield i
 print('good',x)

第一次调用__next__函数的时候,我们从fun的起点开始,然后在yield处结束,需要注意的是,赋值语句不会调用,此处yield i和含义和return差不多。

但是第二次调用__next__函数的时候,就会直接从上一个yield的结束处开始,也就是先执行赋值语句,然后输出字符串,进入下一个循环,直到下一个yield或者生成器结束

再次看初始的那段代码,可以发现第二次调用的时候没有选择使用__next__函数,而是使用了一个sent()函数。这里就需要注意,sent()函数的用法和__next__函数不太一样。sent()函数只能从yield之后开始,到下一个yield结束。这也就意味着第一次调用必须使用__next__函数。

sent()函数最重要的作用在于它可以给yield对应的赋值语句赋值,比如上面那一段代码中的

x=yield i

如果调用__next()__函数,那么x=None。但是如果调用sent(5),那么x=5。除了上述将的两个特征以外,sent和next并没有什么区别,sent函数也会返回yield表达式对应的值

next函数调用次可能有限

需要特别注意的是,尽管是生成器。但是next函数的调用次数可能是有限的。比如下面这段代码

def fun():
for i in range(20):
 x=yield i
 print('good',x)
if __name__ == '__main__':
a=fun()
for i in range(30):
 x=a.__next__()
 print(x)

生成器里的函数只循环了20次,但是next函数却调用了30次,这时候就会触发StopIteration异常。

总结

以上所述是小编给大家介绍的Python中的yield关键字,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python实现数通设备端口监控示例
Apr 02 Python
Python中使用logging模块打印log日志详解
Apr 05 Python
Python自动化开发学习之三级菜单制作
Jul 14 Python
在python 不同时区之间的差值与转换方法
Jan 14 Python
解决python中画图时x,y轴名称出现中文乱码的问题
Jan 29 Python
PyQt编程之如何在屏幕中央显示窗体的实例
Jun 18 Python
如何使用django的MTV开发模式返回一个网页
Jul 22 Python
Python3 实现减少可调用对象的参数个数
Dec 20 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
Feb 12 Python
python实现飞船大战
Apr 24 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
Jan 28 Python
详解Python如何批量采集京东商品数据流程
Jan 22 Python
Python3.6安装及引入Requests库的实现方法
Jan 24 #Python
pycharm+django创建一个搜索网页实例代码
Jan 24 #Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
Jan 24 #Python
Sublime开发python程序的示例代码
Jan 24 #Python
安装python3的时候就是输入python3死活没有反应的解决方法
Jan 24 #Python
Python爬虫天气预报实例详解(小白入门)
Jan 24 #Python
Python实现PS滤镜碎片特效功能示例
Jan 24 #Python
You might like
咖啡与牛奶
2021/03/03 冲泡冲煮
PHP利用超级全局变量$_POST来接收表单数据的实例
2016/11/05 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
PHP children()函数讲解
2019/02/03 PHP
js option删除代码集合
2008/11/12 Javascript
Extjs学习笔记之四 工具栏和菜单
2010/01/07 Javascript
JavaScript 基础篇之对象、数组使用介绍(三)
2012/04/07 Javascript
js 获取class的元素的方法 以及创建方法getElementsByClassName
2013/03/11 Javascript
VS2008中使用JavaScript调用WebServices
2014/12/18 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
json传值以及ajax接收详解
2016/05/24 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
详解easyui基于 layui.laydate日期扩展组件
2018/07/18 Javascript
微信小程序局部刷新触发整页刷新效果的实现代码
2018/11/21 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【矩形情况】
2018/12/13 Javascript
详解React 服务端渲染方案完美的解决方案
2018/12/14 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
详解JavaScript中的this指向问题
2021/02/05 Javascript
vue3.0 项目搭建和使用流程
2021/03/04 Vue.js
python web基础之加载静态文件实例
2018/03/20 Python
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
Python中super函数用法实例分析
2019/03/18 Python
python实现抽奖小程序
2020/04/15 Python
Django中密码的加密、验密、解密操作
2019/12/19 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
Python使用Matlab命令过程解析
2020/06/04 Python
可爱的童装和鞋子:Fabkids
2019/08/16 全球购物
英国标志性生活方式品牌:Skinnydip London
2019/12/15 全球购物
世界上最大的字体市场:MyFonts
2020/01/10 全球购物
运动会跳远加油稿
2014/02/20 职场文书
初三班主任寄语大全
2014/04/04 职场文书
个人汇报材料范文
2014/12/30 职场文书
居安思危观后感
2015/06/11 职场文书
改进工作作风心得体会
2016/01/23 职场文书
如何用JavaScript实现一个数组惰性求值库
2021/05/05 Javascript