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 图片验证码代码分享
Jul 04 Python
python实现忽略大小写对字符串列表排序的方法
Sep 25 Python
Python实现获取操作系统版本信息方法
Apr 08 Python
Python应用03 使用PyQT制作视频播放器实例
Dec 07 Python
Python字符串拼接的几种方法整理
Aug 02 Python
Flask-Mail用法实例分析
Jul 21 Python
python获取点击的坐标画图形的方法
Jul 09 Python
Python基于xlutils修改表格内容过程解析
Jul 28 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
Sep 03 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
Sep 03 Python
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
Jun 23 Python
C3 线性化算法与 MRO之Python中的多继承
Oct 05 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排序算法的复习和总结
2012/02/15 PHP
无JS,完全php面向过程数据分页实现代码
2012/08/27 PHP
apache和php之间协同工作的配置经验分享
2013/04/08 PHP
在php和MySql中计算时间差的方法详解
2015/03/27 PHP
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
2016/03/21 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
JS代码放在head和body中的区别分析
2011/12/01 Javascript
js关闭子窗体刷新父窗体实现方法
2012/12/04 Javascript
javascript 日期时间 转换的方法
2013/02/21 Javascript
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
js读取注册表的键值示例
2013/09/25 Javascript
jQuery实现锚点scoll效果实例分析
2015/03/10 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
简单分析javascript中的函数
2016/09/10 Javascript
jQuery给指定的table动态添加删除行的操作方法
2016/10/12 Javascript
js判断出两个字符串最大子串的函数实现方法
2016/11/01 Javascript
Bootstrap3 datetimepicker控件使用实例
2016/12/13 Javascript
详解nodeJS之二进制buffer对象
2017/06/03 NodeJs
浅谈使用React.setState需要注意的三点
2017/12/18 Javascript
Chart.js 轻量级HTML5图表绘制工具库(知识整理)
2018/05/22 Javascript
Python中的hypot()方法使用简介
2015/05/18 Python
python使用suds调用webservice接口的方法
2019/01/03 Python
详解python 条件语句和while循环的实例代码
2020/12/28 Python
前端面试必备之CSS3的新特性
2017/09/05 HTML / CSS
美国最大网上鞋店:Zappos
2016/07/25 全球购物
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
生产部厂长助理职位说明书
2014/03/03 职场文书
珍惜水资源建议书
2014/03/12 职场文书
新年晚会主持词
2014/03/24 职场文书
护士演讲稿优秀范文
2014/04/30 职场文书
小学生国庆节演讲稿
2014/09/05 职场文书
四年级小学生评语
2014/12/26 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书
小学教师教学反思
2016/02/24 职场文书
MySQL数据迁移相关总结
2021/04/29 MySQL