深入浅析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中for循环的使用方法
May 14 Python
python实现日常记账本小程序
Mar 10 Python
谈谈Python中的while循环语句
Mar 10 Python
python实现将文件夹内的每张图片批量分割成多张
Jul 22 Python
Django 缓存配置Redis使用详解
Jul 23 Python
numpy 声明空数组详解
Dec 05 Python
利用pyshp包给shapefile文件添加字段的实例
Dec 06 Python
使用python turtle画高达
Jan 19 Python
Python 批量读取文件中指定字符的实现
Mar 06 Python
Python Pandas list列表数据列拆分成多行的方法实现
Dec 14 Python
Jupyter Notebook 安装配置与使用详解
Jan 06 Python
python切片作为占位符使用实例讲解
Feb 17 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
DC动画很好看?新作烂得令人发指,名叫《红色之子》
2020/04/09 欧美动漫
PHP延迟静态绑定示例分享
2014/06/22 PHP
详解PHP+AJAX无刷新分页实现方法
2015/11/03 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
2018/01/29 PHP
ThinkPHP中图片按比例切割的代码实例
2019/03/08 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
2020/03/23 PHP
js中关于String对象的replace使用详解
2011/05/24 Javascript
Javascript对象中关于setTimeout和setInterval的this介绍
2012/07/21 Javascript
JavaScript的各种常见函数定义方法
2014/09/16 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
2015/03/04 Javascript
js调用webservice构造SOAP进行身份验证
2016/04/27 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
2016/05/19 Javascript
解读Bootstrap v4 sass设计
2016/05/29 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
2017/03/17 Javascript
关于Vue实现组件信息的缓存问题
2017/08/23 Javascript
javascript将list转换成树状结构的实例
2017/09/08 Javascript
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
100行代码实现一个vue分页组功能
2018/11/06 Javascript
微信小程序实现同一页面取值的方法分析
2019/04/30 Javascript
[38:30]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场2
2014/05/24 DOTA
python实现的文件同步服务器实例
2015/06/02 Python
python导出chrome书签到markdown文件的实例代码
2017/12/27 Python
python实现决策树分类(2)
2018/08/30 Python
在Python中实现shuffle给列表洗牌
2018/11/08 Python
Python解析、提取url关键字的实例详解
2018/12/17 Python
Python描述数据结构学习之哈夫曼树篇
2020/09/07 Python
美国网上花店:JustFlowers
2017/02/12 全球购物
四风对照检查材料范文
2014/09/27 职场文书
英文感谢信格式
2015/01/21 职场文书
副总经理岗位职责
2015/02/02 职场文书
西双版纳导游词
2015/02/03 职场文书
反腐倡廉观后感
2015/06/08 职场文书
红领巾广播站广播稿
2015/08/19 职场文书
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android
腾讯云服务器部署前后分离项目之前端部署
2022/06/28 Servers