深入浅析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使用socket远程连接错误处理方法
Apr 29 Python
Python实现统计单词出现的个数
May 28 Python
python动态网页批量爬取
Feb 14 Python
设计模式中的原型模式在Python程序中的应用示例
Mar 02 Python
python3+PyQt5使用数据库窗口视图
Apr 24 Python
详解Python 数据库的Connection、Cursor两大对象
Jun 25 Python
基于python实现名片管理系统
Nov 30 Python
Python 微信爬虫完整实例【单线程与多线程】
Jul 06 Python
使用python 对验证码图片进行降噪处理
Dec 18 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
Feb 16 Python
python设置环境变量的作用整理
Feb 17 Python
解决reload(sys)后print失效的问题
Apr 25 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通用检测函数集合
2006/11/25 PHP
PR值查询 | PageRank 查询
2006/12/20 PHP
php数组(array)输出的三种形式详解
2013/06/05 PHP
PHP使用PDO操作数据库的乱码问题解决方法
2016/04/08 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
Ext 今日学习总结
2010/09/19 Javascript
web的各种前端打印方法之jquery打印插件jqprint实现网页打印
2013/01/09 Javascript
jQuery基本选择器选择元素使用介绍
2013/04/18 Javascript
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
2015/03/04 Javascript
JS实现按钮颜色切换效果
2020/09/05 Javascript
巧妙运用v-model实现父子组件传值的方法示例
2019/04/07 Javascript
Javascript 对象(object)合并操作实例分析
2019/07/30 Javascript
JavaScript使用prototype属性实现继承操作示例
2020/05/22 Javascript
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
2020/11/18 Vue.js
python使用pil生成缩略图的方法
2015/03/26 Python
Python字符串转换成浮点数函数分享
2015/07/24 Python
Django框架使用富文本编辑器Uedit的方法分析
2018/07/31 Python
Python函数参数操作详解
2018/08/03 Python
python实现简单名片管理系统
2018/11/30 Python
python如何给字典的键对应的值为字典项的字典赋值
2019/07/05 Python
Pyinstaller 打包exe教程及问题解决
2019/08/16 Python
python中的global关键字的使用方法
2019/08/20 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
django框架中间件原理与用法详解
2019/12/10 Python
matlab中二维插值函数interp2的使用详解
2020/04/22 Python
Python selenium爬取微信公众号文章代码详解
2020/08/12 Python
HTML5 canvas绘制的玫瑰花效果
2014/05/29 HTML / CSS
html5在移动端的屏幕适应问题示例探讨
2014/06/15 HTML / CSS
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
学生打架检讨书大全
2014/01/23 职场文书
大学毕业生自我评价
2015/03/02 职场文书
新教师教学工作总结
2015/08/14 职场文书
朋友圈早安励志语录!
2019/07/08 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL