深入浅析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实现定制交互式命令行的方法
Jul 03 Python
如何处理Python3.4 使用pymssql 乱码问题
Jan 08 Python
对python多线程中Lock()与RLock()锁详解
Jan 11 Python
python爬虫之自制英汉字典
Jun 24 Python
python框架flask表单实现详解
Nov 04 Python
Python进阶之迭代器与迭代器切片教程
Jan 29 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
Feb 27 Python
在服务器上安装python3.8.2环境的教程详解
Apr 26 Python
解决Python Matplotlib绘图数据点位置错乱问题
May 16 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
Jun 30 Python
Python环境使用OpenCV检测人脸实现教程
Oct 19 Python
Python scrapy爬取起点中文网小说榜单
Jun 13 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
PHP时间戳 strtotime()使用方法和技巧
2013/10/29 PHP
php调用C代码的实现方法
2014/03/11 PHP
PHP常用的三种设计模式汇总
2016/08/28 PHP
php微信公众平台开发之微信群发信息
2016/09/13 PHP
thinkPHP5.0框架简单配置作用域的方法
2017/03/17 PHP
javascript动态添加表格数据行(ASP后台数据库保存例子)
2010/05/08 Javascript
Prototype源码浅析 String部分(四)之补充
2012/01/16 Javascript
angular.element方法汇总
2015/01/07 Javascript
JavaScript数据类型之基本类型和引用类型的值
2015/04/01 Javascript
javascript实现控制文字大中小显示
2015/04/28 Javascript
浅谈JavaScript for循环 闭包
2016/06/22 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
原生JS实现在线问卷调查投票特效
2017/01/03 Javascript
走进javascript——不起眼的基础,值和分号
2017/02/24 Javascript
react路由配置方式详解
2017/08/07 Javascript
webpack2.0配置postcss-loader的方法
2017/08/17 Javascript
JavaScript实用代码小技巧
2018/08/23 Javascript
详解小程序不同页面之间通讯的解决方案
2018/11/23 Javascript
Vue中使用canvas方法总结
2019/02/12 Javascript
angular8和ngrx8结合使用的步骤介绍
2019/12/01 Javascript
基于vue.js实现购物车
2020/01/15 Javascript
浅谈js数组splice删除某个元素爬坑
2020/10/14 Javascript
[01:20:06]TNC vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python异步任务队列示例
2014/04/01 Python
正确理解Python中if __name__ == '__main__'
2019/01/24 Python
解决yum对python依赖版本问题
2019/07/05 Python
Python实现PyPDF2处理PDF文件的方法示例
2019/09/25 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
2020/11/17 Python
阿玛瑞酒店中文官方网站:Amari.com
2018/02/13 全球购物
教师节随笔
2015/08/15 职场文书
2016年幼儿园庆六一开幕词
2016/03/04 职场文书
2019初中学生入团申请书
2019/06/27 职场文书
Mysql 如何实现多张无关联表查询数据并分页
2021/06/05 MySQL
html中相对位置与绝对位置的具体使用
2022/05/15 HTML / CSS