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实现的一只从百度开始不断搜索的小爬虫
Aug 13 Python
跟老齐学Python之print详解
Sep 28 Python
Windows下Python2与Python3两个版本共存的方法详解
Feb 12 Python
python开发利器之ulipad的使用实践
Mar 16 Python
人生苦短我用python python如何快速入门?
Mar 12 Python
python 实现批量xls文件转csv文件的方法
Oct 23 Python
Python多版本开发环境管理工具介绍
Jul 03 Python
给 TensorFlow 变量进行赋值的方式
Feb 10 Python
python 实现字符串下标的输出功能
Feb 13 Python
Python实现Keras搭建神经网络训练分类模型教程
Jun 12 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
Aug 11 Python
python 命令行传参方法总结
May 25 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
php数组键值用法实例分析
2015/02/27 PHP
PHP使用缓存即时输出内容(output buffering)的方法
2015/08/03 PHP
Laravel4中的Validator验证扩展用法详解
2016/07/26 PHP
php自定义扩展名获取函数示例
2016/12/12 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
2019/02/08 PHP
XRegExp 0.2: Now With Named Capture
2007/11/30 Javascript
Javascript Object 对象学习笔记
2014/12/17 Javascript
jQuery中insertAfter()方法用法实例
2015/01/08 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
2016/06/24 Javascript
微信小程序 定位到当前城市实现实例代码
2017/02/23 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
Vue按时间段查询数据组件使用详解
2020/08/21 Javascript
node脚手架搭建服务器实现token验证的方法
2021/01/20 Javascript
python实现感知器
2017/12/19 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
解决每次打开pycharm直接进入项目的问题
2018/10/28 Python
numpy中的ndarray方法和属性详解
2019/05/27 Python
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
PyQt5实现QLineEdit添加clicked信号的方法
2019/06/25 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
如何使用Python脚本实现文件拷贝
2019/11/20 Python
Python面向对象编程基础实例分析
2020/01/17 Python
python如何将图片转换素描画
2020/09/08 Python
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
旷课检讨书3000字
2014/02/04 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书
环卫处个人工作总结
2015/03/04 职场文书
求职信格式范文
2015/03/19 职场文书
2015年幼儿园学前班工作总结
2015/05/18 职场文书
大学入学感言
2015/08/01 职场文书
一文帮你理解PReact10.5.13源码
2021/04/03 Javascript
MySQL为id选择合适的数据类型
2021/06/07 MySQL
mysql备份策略的实现(全量备份+增量备份)
2021/07/07 MySQL