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 相关文章推荐
仅用50行Python代码实现一个简单的代理服务器
Apr 08 Python
python实现聊天小程序
Mar 13 Python
Pandas 对Dataframe结构排序的实现方法
Apr 10 Python
python训练数据时打乱训练数据与标签的两种方法小结
Nov 08 Python
python判断一个数是否能被另一个整数整除的实例
Dec 12 Python
对python numpy.array插入一行或一列的方法详解
Jan 29 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
Oct 14 Python
Python-opencv 双线性插值实例
Jan 17 Python
python实现图像拼接
Mar 05 Python
Python如何用wx模块创建文本编辑器
Jun 07 Python
python闭包与引用以及需要注意的陷阱
Sep 18 Python
利用Python判断整数是否是回文数的3种方法总结
Jul 07 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
Could not load type System.ServiceModel.Activation.HttpModule解决办法
2012/12/29 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
2013/06/18 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
js解析与序列化json数据(三)json的解析探讨
2013/02/01 Javascript
jquery选择器-根据多个属性选择示例代码
2013/10/21 Javascript
jquery 页面滚动到底部自动加载插件集合
2014/01/31 Javascript
JS的location.href跳出框架打开新页面的方法
2014/09/04 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
jQuery深拷贝Json对象简单示例
2016/07/06 Javascript
JS如何设置cookie有效期为当天24点并弹出欢迎登陆界面
2016/08/04 Javascript
jQuery中ajax错误调试分析
2016/12/01 Javascript
assert()函数用法总结(推荐)
2017/01/25 Javascript
Angular4如何自定义首屏的加载动画详解
2017/07/26 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
深入浅析python继承问题
2016/05/29 Python
一文总结学习Python的14张思维导图
2017/10/17 Python
Python中xml和dict格式转换的示例代码
2019/11/07 Python
Python计算公交发车时间的完整代码
2020/02/12 Python
使用Python发现隐藏的wifi
2020/03/04 Python
Numpy 多维数据数组的实现
2020/06/18 Python
新奥尔良珠宝:Mignon Faget
2020/11/23 全球购物
荷兰DOD药房中文官网:DeOnlineDrogist
2020/12/27 全球购物
如何用Lucene索引数据库
2016/02/23 面试题
应届生服装设计自我评价
2013/09/20 职场文书
业务经理岗位职责
2013/11/11 职场文书
学生自我鉴定模板
2013/12/30 职场文书
销售主管岗位职责范本
2014/02/14 职场文书
团日活动总结报告
2014/06/25 职场文书
计划生育证明格式范本
2014/09/12 职场文书
个人收入证明范本
2014/09/18 职场文书
2014年公务员个人工作总结
2014/11/22 职场文书
英文升职感谢信
2015/01/23 职场文书
2015年中秋节演讲稿
2015/03/20 职场文书
大学生活感想
2015/08/10 职场文书
php字符串倒叙
2021/04/01 PHP