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中模块string.py详解
Mar 12 Python
详解Python3.6的py文件打包生成exe
Jul 13 Python
Numpy截取指定范围内的数据方法
Nov 14 Python
浅谈python下含中文字符串正则表达式的编码问题
Dec 07 Python
解决django前后端分离csrf验证的问题
Feb 03 Python
Python3多线程基础知识点
Feb 19 Python
python3中eval函数用法使用简介
Aug 02 Python
Python使用Slider组件实现调整曲线参数功能示例
Sep 06 Python
在django-xadmin中APScheduler的启动初始化实例
Nov 15 Python
使用Keras实现简单线性回归模型操作
Jun 12 Python
python3爬虫中异步协程的用法
Jul 10 Python
使用anaconda安装pytorch的实现步骤
Sep 03 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 expects parameter 1 to be resource, array given 错误
2011/03/23 PHP
细谈php中SQL注入攻击与XSS攻击
2012/06/10 PHP
精美漂亮的php分页类代码
2013/04/02 PHP
php中session与cookie的比较
2015/01/27 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
thinkphp3.2同时连接两个数据库的简单方法
2019/08/13 PHP
HTML TO JavaScript 转换
2006/06/26 Javascript
将string解析为json的几种方式小结
2010/11/11 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
2015/10/27 Javascript
javascript实现获取浏览器版本、浏览器类型
2015/12/02 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
2016/12/29 Javascript
详解webpack+es6+angular1.x项目构建
2017/05/02 Javascript
jQuery实现滚动效果
2017/11/17 jQuery
JavaScript多线程运行库Nexus.js详解
2017/12/22 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
ES6 新增的创建数组的方法(小结)
2019/08/01 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
2019/09/12 Javascript
vue子传父关于.sync与$emit的实现
2019/11/05 Javascript
python实现多线程网页下载器
2018/04/15 Python
Python DataFrame设置/更改列表字段/元素类型的方法
2018/06/09 Python
python使用xlrd和xlwt读写Excel文件的实例代码
2018/09/05 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
2019/07/04 Python
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
浅谈pymysql查询语句中带有in时传递参数的问题
2020/06/05 Python
Python如何执行精确的浮点数运算
2020/07/31 Python
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
Clarks其乐鞋荷兰官网:Clarks荷兰
2019/07/05 全球购物
经典优秀个人求职自荐信格式
2013/09/25 职场文书
宿舍违规检讨书
2014/01/12 职场文书
新学期教师寄语
2014/04/02 职场文书
软件项目开发计划书
2014/05/01 职场文书
教师学习群众路线心得体会
2014/11/04 职场文书
2016年五一促销广告语
2016/01/28 职场文书
人民调解协议书
2016/03/21 职场文书
MySQL5.7并行复制原理及实现
2021/06/03 MySQL