深入浅析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 文件和输入输出小结
Oct 09 Python
jupyter安装小结
Mar 13 Python
Python的Flask框架中配置多个子域名的方法讲解
Jun 07 Python
python TKinter获取文本框内容的方法
Oct 11 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
pd.DataFrame统计各列数值多少的实例
Dec 05 Python
Python3常见函数range()用法详解
Dec 30 Python
Window系统下Python如何安装OpenCV库
Mar 05 Python
python能自学吗
Jun 18 Python
python pandas dataframe 去重函数的具体使用
Jul 20 Python
python 使用三引号时容易犯的小错误
Oct 21 Python
python 下划线的不同用法
Oct 24 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中常量,变量的作用域和生存周期
2013/08/10 PHP
详解PHP如何更好的利用PHPstorm的自动提示
2017/08/18 PHP
PHP+Apache环境中如何隐藏Apache版本
2017/11/24 PHP
JQuery 学习笔记 选择器之三
2009/07/23 Javascript
JQuery与JS里submit()的区别示例介绍
2014/02/17 Javascript
改变隐藏的input中value值的方法
2014/03/19 Javascript
node.js中的fs.symlink方法使用说明
2014/12/15 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
Vue实现动态响应数据变化
2017/04/28 Javascript
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
详解vue的diff算法原理
2018/05/20 Javascript
react native 原生模块桥接的简单说明小结
2019/02/26 Javascript
javascrit中undefined和null的区别详解
2019/04/07 Javascript
vue项目实现减少app.js和vender.js的体积操作
2020/11/12 Javascript
JavaScript实现无限轮播效果
2020/11/19 Javascript
python 字符串split的用法分享
2013/03/23 Python
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
PyMongo安装使用笔记
2015/04/27 Python
Django 导出 Excel 代码的实例详解
2017/08/11 Python
设置python3为默认python的方法
2018/10/31 Python
Python 脚本获取ES 存储容量的实例
2018/12/27 Python
对Python模块导入时全局变量__all__的作用详解
2019/01/11 Python
Python3多线程基础知识点
2019/02/19 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
Win10环境python3.7安装dlib模块趟过的坑
2019/08/01 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
2019/08/24 Python
英国曼彻斯特宠物用品品牌:Bunty Pet Products
2019/07/27 全球购物
JavaScript实现前端网页版倒计时
2021/03/24 Javascript
成功的酒店创业计划书
2013/12/27 职场文书
时尚休闲吧创业计划书
2014/01/25 职场文书
班主任评语大全
2014/04/26 职场文书
教师查摆问题及整改措施
2014/10/11 职场文书
2014年电厂个人工作总结
2014/11/27 职场文书
Python制作表白爱心合集
2022/01/22 Python
openEuler 搭建java开发环境的详细过程
2022/06/10 Servers