深入浅析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中的一些类型转换函数小结
Feb 10 Python
如何解决django配置settings时遇到Could not import settings 'conf.local'
Nov 18 Python
python通过邮件服务器端口发送邮件的方法
Apr 30 Python
python类:class创建、数据方法属性及访问控制详解
Jul 25 Python
python数据预处理之将类别数据转换为数值的方法
Jul 05 Python
pandas 实现字典转换成DataFrame的方法
Jul 04 Python
Python基于sklearn库的分类算法简单应用示例
Jul 09 Python
Python元组常见操作示例
Feb 19 Python
如何运行.ipynb文件的图文讲解
Jun 27 Python
Python使用get_text()方法从大段html中提取文本的实例
Aug 27 Python
Python操作Sqlite正确实现方法解析
Feb 05 Python
Python爬虫之爬取二手房信息
Apr 27 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执行sql语句的写法
2009/03/10 PHP
php mssql 分页SQL语句优化 持续影响
2009/04/26 PHP
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
2012/07/23 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
2015/01/21 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
2015/11/17 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
2017/11/07 PHP
通过隐藏option实现select的联动效果
2009/11/10 Javascript
js 强制弹出窗口代码研究-又一款代码
2010/03/20 Javascript
jquery退出each循环的写法
2014/02/26 Javascript
js读取被点击次数的简单实例(从数据库中读取)
2014/03/07 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
2015/07/27 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
2016/07/01 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
Vue中的数据监听和数据交互案例解析
2017/07/12 Javascript
微信小程序授权登陆及每次检查是否授权实例代码
2019/09/18 Javascript
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
Python os模块介绍
2014/11/30 Python
Python搭建HTTP服务器和FTP服务器
2017/03/09 Python
Python列表解析配合if else的方法
2018/06/23 Python
Python错误处理操作示例
2018/07/18 Python
python实现ip地址查询经纬度定位详解
2019/08/30 Python
python matplotlib饼状图参数及用法解析
2019/11/04 Python
KEEN美国官网:美国人气户外休闲鞋品牌
2021/03/09 全球购物
新东网科技Java笔试题
2012/07/13 面试题
医药专业应届毕业生求职信范文
2014/01/01 职场文书
高中打架检讨书
2014/02/13 职场文书
医院我们的节日活动实施方案
2014/08/22 职场文书
2015年财务人员工作总结
2015/04/10 职场文书
交通事故起诉书
2015/05/19 职场文书
借条如何写
2015/05/26 职场文书
大学生见习总结报告
2015/06/24 职场文书
员工旷工检讨书
2015/08/15 职场文书
一文搞懂python异常处理、模块与包
2021/06/26 Python
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
2021/06/29 Python