Python中Yield的基本用法


Posted in Python onOctober 18, 2020

带有yield的函数在Python中被称之为generator(生成器),也就是说,当你调用这个函数的时候,函数内部的代码并不立即执行 ,这个函数只是返回一个生成器(Generator Iterator)。

def generator():
 for i in range(10) :
  yield i*i

gen = generator()
print(gen)

<generator object generator at 0x7ffaad115aa0>

1. 使用next方法迭代生成器

generator函数怎么调用呢?答案是next函数。

print("first iteration:")
print(next(gen))

print("second iteration:")
print(next(gen))

print("third iteration:")
print(next(gen))

print("fourth iteration:")
print(next(gen))

程序输出:

first iteration:
 0
 second iteration:
 1
 three iteration:
 4
 four iteration:
 9

在函数第一次调用next(gen)函数时,generator函数从开始执行到yield,并返回yield之后的值。

在函数第二次调用next(gen)函数时,generator函数从上一次yield结束的地方继续运行,直至下一次执行到yield的地方,并返回yield之后的值。依次类推。

2. 使用send()方法与生成器函数通信

def generator():
 x = 1
 while True:
  y = (yield x)
  x += y

gen = generator()
  
print("first iteration:")
print(next(gen))

print("send iteration:")
print(gen.send(10))

代码输出:

first iteration:
 1
 send iteration:
 11

生成器(generator)函数用yield表达式将处理好的x发送给生成器(Generator)的调用者;然后生成器(generator)的调用者可以通过send函数,将外部信息替换生成器内部yield表达式的返回值,并赋值给y,并参与后续的迭代流程。

3. Yield的好处

Python之所以要提供这样的解决方案,主要是内存占用和性能的考量。看类似下面的代码:

for i in range(10000):
  ...

上述代码的问题在于,range(10000)生成的可迭代的对象都在内存中,如果数据量很大比较耗费内存。

而使用yield定义的生成器(Generator)可以很好的解决这一问题。

参考材料

  • https://pyzh.readthedocs.io/en/latest/the-python-yield-keyword-explained.html
  • https://liam.page/2017/06/30/understanding-yield-in-python/

总结

到此这篇关于Python中Yield基本用法的文章就介绍到这了,更多相关Python Yield用法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中的装饰器用法详解
Jan 14 Python
python用来获得图片exif信息的库实例分析
Mar 16 Python
Python应用03 使用PyQT制作视频播放器实例
Dec 07 Python
Python 多线程实例详解
Mar 25 Python
Python中定时任务框架APScheduler的快速入门指南
Jul 06 Python
TensorFlow高效读取数据的方法示例
Feb 06 Python
Python实现操纵控制windows注册表的方法分析
May 24 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
Sep 20 Python
Python TCP通信客户端服务端代码实例
Nov 21 Python
python实现小世界网络生成
Nov 21 Python
python 的topk算法实例
Apr 02 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
Jun 15 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
Oct 18 #Python
Python通过format函数格式化显示值
Oct 17 #Python
Python如何使用vars返回对象的属性列表
Oct 17 #Python
Python使用eval函数执行动态标表达式过程详解
Oct 17 #Python
Python基于locals返回作用域字典
Oct 17 #Python
Python classmethod装饰器原理及用法解析
Oct 17 #Python
Python基于staticmethod装饰器标示静态方法
Oct 17 #Python
You might like
搜索和替换文件或目录的一个好类--很实用
2006/10/09 PHP
收藏的一个php小偷的核心程序
2007/04/09 PHP
PHP排序算法的复习和总结
2012/02/15 PHP
学习php设计模式 php实现单例模式(singleton)
2015/12/07 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
php调用云片网接口发送短信的实现方法
2017/10/25 PHP
jQuery 可以拖动的div实现代码 脚本之家修正版
2009/06/26 Javascript
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
JS加jquery简单实现标签元素的显示或隐藏
2013/09/23 Javascript
原生js实现日期联动
2015/01/12 Javascript
JS数组合并push与concat区别分析
2015/12/17 Javascript
基于jQuery仿淘宝产品图片放大镜特效
2020/10/19 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
Popup弹出框添加数据实现方法
2017/10/27 Javascript
使用JS实现导航切换时高亮显示的示例讲解
2018/08/22 Javascript
新年快乐! javascript实现超级炫酷的3D烟花特效
2019/01/30 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
2020/09/25 Javascript
让Python代码更快运行的5种方法
2015/06/21 Python
Python实现简单多线程任务队列
2016/02/27 Python
python 网络爬虫初级实现代码
2016/02/27 Python
Python基础教程之tcp socket编程详解及简单实例
2017/02/23 Python
Python学习笔记之if语句的使用示例
2017/10/23 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
python 工具 字符串转numpy浮点数组的实现
2020/03/14 Python
在python里使用await关键字来等另外一个协程的实例
2020/05/04 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
python正则表达式re.match()匹配多个字符方法的实现
2021/01/27 Python
上海天奕面试题笔试题
2015/04/19 面试题
军神教学反思
2014/02/04 职场文书
党员电教片《信仰》心得体会
2016/01/15 职场文书
Python实现简单的俄罗斯方块游戏
2021/09/25 Python
与Windows10相比Windows11有哪些改进?值不值得升级?
2021/11/21 数码科技
MYSQL中文乱码问题的解决方案
2022/06/14 MySQL