深入浅析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错误处理详解
Sep 28 Python
Python生成器以及应用实例解析
Feb 08 Python
Python 实现在文件中的每一行添加一个逗号
Apr 29 Python
将python图片转为二进制文本的实例
Jan 24 Python
Python3.5实现的罗马数字转换成整数功能示例
Feb 25 Python
Python代码太长换行的实现
Jul 05 Python
python自动化测试之DDT数据驱动的实现代码
Jul 23 Python
Python中输入和输出(打印)数据实例方法
Oct 13 Python
利用matplotlib实现根据实时数据动态更新图形
Dec 13 Python
Python django框架开发发布会签到系统(web开发)
Feb 12 Python
python图片合成的示例
Nov 09 Python
看看如何用Python绘制小米新版天价logo
Apr 20 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远程连接MYSQL数据库非常慢的解决方法
2008/07/05 PHP
PHP 伪静态隐藏传递参数名的四种方法
2010/02/22 PHP
PHP中如何判断AJAX提交的数据
2012/02/05 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
2013/12/25 PHP
php结合安卓客户端实现查询交互实例
2015/05/05 PHP
php解决DOM乱码的方法示例代码
2016/11/20 PHP
php获取'/'传参的值简单方法
2017/07/13 PHP
Span元素的width属性无效果原因及解决方案
2010/01/15 Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
2014/09/01 Javascript
JavaScript中数组成员的添加、删除介绍
2014/12/30 Javascript
BootStrap模态框不垂直居中的解决方法
2017/10/19 Javascript
js实现按钮开关单机下拉菜单效果
2018/11/22 Javascript
关于微信公众号开发无法支付的问题解决
2018/12/28 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
Ajax请求时无法重定向的问题解决代码详解
2019/06/21 Javascript
在VUE style中使用data中的变量的方法
2020/06/19 Javascript
[38:31]完美世界DOTA2联赛PWL S3 Magma vs GXR 第一场 12.13
2020/12/17 DOTA
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
2019/08/15 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
2020/03/11 Python
美国女性服饰销售网站:Nasty Gal(坏女孩)
2016/07/26 全球购物
意大利独特而优质的家居用品:Fazzini
2018/12/05 全球购物
即将毕业大学生自荐信
2014/01/24 职场文书
学校消防安全制度
2014/01/30 职场文书
加油口号大全
2014/06/13 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
党员作风建设整改方案
2014/10/27 职场文书
社会实践活动总结
2015/02/05 职场文书
博士给导师的自荐信
2015/03/06 职场文书
《青山不老》教学反思
2016/02/22 职场文书
pytorch--之halfTensor的使用详解
2021/05/24 Python
十大动画制作软件,Adobe产品上榜两款,第一是行业标准软件
2022/03/18 杂记
微信小程序调用python模型
2022/04/21 Python