深入浅析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中遍历文件的3个方法
Sep 02 Python
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
Mar 31 Python
python递归打印某个目录的内容(实例讲解)
Aug 30 Python
Python使用ConfigParser模块操作配置文件的方法
Jun 29 Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
Oct 11 Python
Python类如何定义私有变量
Feb 03 Python
Python实现获取当前目录下文件名代码详解
Mar 10 Python
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
May 07 Python
Django实现随机图形验证码的示例
Oct 15 Python
Python3利用openpyxl读写Excel文件的方法实例
Feb 03 Python
python 如何用urllib与服务端交互(发送和接收数据)
Mar 04 Python
PyQt5 QThread倒计时功能的实现代码
Apr 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三层结构(上) 简单三层结构
2010/07/04 PHP
分享下php5类中三种数据类型的区别
2015/01/26 PHP
Yii视图操作之自定义分页实现方法
2016/07/14 PHP
探究Laravel使用env函数读取环境变量为null的问题
2016/12/06 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
用JavaScript隐藏控件的方法
2009/09/21 Javascript
jQuery前台数据获取实现代码
2011/03/16 Javascript
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
2011/07/26 Javascript
给应用部分的js代码设定一个统一的入口
2014/06/15 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
有关jQuery中parent()和siblings()的小问题
2016/06/01 Javascript
详解如何使用Node.js编写命令工具——以vue-cli为例
2017/06/29 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
vue如何搭建多页面多系统应用
2020/06/17 Javascript
[36:33]完美世界DOTA2联赛循环赛 Matador vs Forest 第一场 11.06
2020/11/06 DOTA
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
python控制台中实现进度条功能
2015/11/10 Python
django admin添加数据自动记录user到表中的实现方法
2018/01/05 Python
PyQT5 emit 和 connect的用法详解
2019/12/13 Python
python中urllib.request和requests的使用及区别详解
2020/05/05 Python
Python-jenkins模块之folder相关操作介绍
2020/05/12 Python
python 录制系统声音的示例
2020/12/21 Python
AmazeUI 网格的实现示例
2020/08/13 HTML / CSS
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
贝佳斯官方网站:Borghese
2020/05/08 全球购物
Penhaligon’s英国官网:成立于1870年的英国香水制造商
2021/02/18 全球购物
Java如何获得ResultSet的总行数
2016/09/03 面试题
单位绩效考核方案
2014/05/11 职场文书
Redis高级数据类型Hyperloglog、Bitmap的使用
2021/05/24 Redis
Python语言规范之Pylint的详细用法
2021/06/24 Python
springboot项目以jar包运行的操作方法
2021/06/30 Java/Android
Python+Tkinter打造签名设计工具
2022/04/01 Python