深入浅析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基于mysql实现的简单队列以及跨进程锁实例详解
Jul 07 Python
Python函数可变参数定义及其参数传递方式实例详解
May 25 Python
Python多线程下载文件的方法
Jul 10 Python
Python实现简单多线程任务队列
Feb 27 Python
微信跳一跳python自动代码解读1.0
Jan 12 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
Oct 11 Python
Python中pyecharts安装及安装失败的解决方法
Feb 18 Python
python实现TCP文件传输
Mar 20 Python
Python应用实现双指数函数及拟合代码实例
Jun 19 Python
jupyter notebook快速入门及使用详解
Nov 13 Python
Python使用psutil库对系统数据进行采集监控的方法
Aug 23 Python
Python实现Hash算法
Mar 18 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
用文本文件制作留言板提示(上)
2006/10/09 PHP
生成ubuntu自动切换壁纸xml文件的php代码
2010/07/17 PHP
php数字游戏 计算24算法
2012/06/10 PHP
基于jquery实现控制经纬度显示地图与卫星
2013/05/20 Javascript
jquery实现无限分级横向导航菜单的方法
2015/03/12 Javascript
JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
2015/12/07 Javascript
jQuery取得iframe中元素的常用方法详解
2016/01/14 Javascript
JavaScript使用readAsDataUrl方法预览图片
2017/05/10 Javascript
详谈表单格式化插件jquery.serializeJSON
2017/06/23 jQuery
通过示例彻底搞懂js闭包
2017/08/10 Javascript
node.js-v6新版安装具体步骤(分享)
2017/09/06 Javascript
解决Vue使用swiper动态加载数据,动态轮播数据显示白屏的问题
2018/09/27 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
layui.tree组件的使用以及搜索节点功能的实现
2019/09/26 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
编程语言Python的发展史
2014/09/26 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
django 环境变量配置过程详解
2019/08/06 Python
Python 中使用 PyMySQL模块操作数据库的方法
2019/11/10 Python
Python面向对象之私有属性和私有方法应用案例分析
2019/12/31 Python
Python列表解析操作实例总结
2020/02/26 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
2020/04/10 Python
深入解读CSS3中transform变换模型的渲染
2016/05/27 HTML / CSS
H5 meta小结(前端必看篇)
2016/08/24 HTML / CSS
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
宝拉珍选美国官网:Paula’s Choice美国
2018/01/07 全球购物
欧洲最大的品牌水上运动服装和设备在线零售商:Wuituit Outlet
2018/05/05 全球购物
电气工程及其自动化学生实习自我鉴定
2013/09/19 职场文书
什么样的创业计划书可行性高?
2014/02/01 职场文书
优秀毕业生的求职信
2014/07/21 职场文书
房地产财务经理岗位职责
2015/04/08 职场文书
教学反思怎么写
2016/02/24 职场文书
FP-growth算法发现频繁项集——构建FP树
2021/06/24 Python