深入浅析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 爬虫的工具列表大全
Jan 31 Python
解决python3 urllib中urlopen报错的问题
Mar 25 Python
Python列表切片用法示例
Apr 19 Python
python中is与双等于号“==”的区别示例详解
Nov 21 Python
python绘制双柱形图代码实例
Dec 14 Python
利用Anaconda简单安装scrapy框架的方法
Jun 13 Python
Python 处理图片像素点的实例
Jan 08 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
Jan 22 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
Apr 15 Python
python redis 批量设置过期key过程解析
Nov 26 Python
Python3 io文本及原始流I/O工具用法详解
Mar 23 Python
基于PyQT5制作一个桌面摸鱼工具
Feb 15 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采用自定义函数实现遍历目录下所有文件的方法
2014/08/19 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
php验证码生成代码
2015/11/11 PHP
Yii2下点击验证码的切换实例代码
2017/03/14 PHP
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
javascript实现的HashMap类代码
2014/06/27 Javascript
仿JQuery输写高效JSLite代码的一些技巧
2015/01/13 Javascript
教你如何终止JQUERY的$.AJAX请求
2016/02/23 Javascript
JQuery遍历元素的父辈和祖先的方法
2016/09/18 Javascript
利用BootStrap弹出二级对话框的简单实现方法
2016/09/21 Javascript
如何编写一个完整的Angular4 FormText 组件
2017/11/18 Javascript
JS实现标签滚动切换效果
2017/12/25 Javascript
Vue 嵌套路由使用总结(推荐)
2020/01/13 Javascript
从Node.js事件触发器到Vue自定义事件的深入讲解
2020/06/26 Javascript
[50:34]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python实现字典的key和values的交换
2015/08/04 Python
Python实现PS图像调整黑白效果示例
2018/01/25 Python
python实现剪切功能
2019/01/23 Python
Python3打包exe代码2种方法实例解析
2020/02/17 Python
Python Django路径配置实现过程解析
2020/11/05 Python
python爬虫爬取某网站视频的示例代码
2021/02/20 Python
IE滤镜与CSS3效果(详细整理分享)
2013/01/25 HTML / CSS
HTML5实现移动端弹幕动画效果
2019/08/01 HTML / CSS
欧洲领先的电子和电信零售商和服务提供商:Currys PC World Business
2017/12/05 全球购物
Java语言的优势
2015/01/10 面试题
党的群众路线学习材料
2014/05/16 职场文书
2014幼儿园家长工作总结
2014/11/10 职场文书
学校中秋节活动总结
2015/03/23 职场文书
2016幼儿园教师年度考核评语
2015/12/01 职场文书
2016继续教育培训学习心得体会
2016/01/19 职场文书
2016七夕情人节广告语
2016/01/28 职场文书
医学会议开幕词
2016/03/03 职场文书
2016年小学圣诞节活动总结
2016/03/31 职场文书
Go语言基础函数基本用法及示例详解
2021/11/17 Golang
Python中如何处理常见报错
2022/01/18 Python