深入浅析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封装对象实现时间效果
Apr 23 Python
处理Python中的URLError异常的方法
Apr 30 Python
Python中字符串的常见操作技巧总结
Jul 28 Python
Python如何import文件夹下的文件(实现方法)
Jan 24 Python
对python pandas 画移动平均线的方法详解
Nov 28 Python
Python和Go语言的区别总结
Feb 20 Python
Python 旋转打印各种矩形的方法
Jul 09 Python
python运用sklearn实现KNN分类算法
Oct 16 Python
django 模版关闭转义方式
May 14 Python
python制作一个简单的gui 数据库查询界面
Nov 19 Python
pytorch 中forward 的用法与解释说明
Feb 26 Python
Python常遇到的错误和异常
Nov 02 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数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
兼容PHP和Java的des加密解密代码分享
2014/06/26 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
javascript concat数组累加 示例
2009/09/03 Javascript
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
2010/01/22 Javascript
javascript将url中的参数加密解密代码
2014/11/17 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
javascript数据类型示例分享
2015/01/19 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
2015/12/15 Javascript
canvas实现动态小球重叠效果
2017/02/06 Javascript
浅谈JavaScript的innerWidth与innerHeight
2017/10/12 Javascript
微信小程序实现tab和swiper切换结合效果
2020/07/17 Javascript
switchery按钮的使用方法
2017/12/18 Javascript
vue.js系列中的vue-fontawesome使用
2018/02/10 Javascript
Vue隐藏显示、只读实例代码
2018/07/18 Javascript
vue实现百度下拉列表交互操作示例
2019/03/12 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
2019/11/12 Javascript
JS实现小米轮播图
2020/09/21 Javascript
JavaScript 异步时序问题
2020/11/20 Javascript
Cython 三分钟入门教程
2009/09/17 Python
Windows下用py2exe将Python程序打包成exe程序的教程
2015/04/08 Python
python获取本机mac地址和ip地址的方法
2015/04/29 Python
Python爬取个人微信朋友信息操作示例
2018/08/03 Python
numpy concatenate数组拼接方法示例介绍
2019/05/27 Python
python 字典操作提取key,value的方法
2019/06/26 Python
pygame实现弹球游戏
2020/04/14 Python
用HTML5制作烟火效果的教程
2015/05/12 HTML / CSS
Html5与App的通讯方式详解
2019/10/24 HTML / CSS
YSL圣罗兰美妆美国官网:Yves Saint Lauret US
2016/11/21 全球购物
Shell如何接收变量输入
2016/08/06 面试题
党的群众路线教育实践活动公开承诺书
2014/03/28 职场文书
社区巾帼文明岗事迹材料
2014/06/03 职场文书
2014年小班保育员工作总结
2014/12/23 职场文书
4种方法python批量修改替换列表中元素
2022/04/07 Python