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连接mssql数据库编码问题解决方法
Jan 01 Python
Python创建系统目录的方法
Mar 11 Python
TensorFlow实现Batch Normalization
Mar 08 Python
django ajax json的实例代码
May 29 Python
python爬虫租房信息在地图上显示的方法
May 13 Python
python实现二级登陆菜单及安装过程
Jun 21 Python
Python3 实现爬取网站下所有URL方式
Jan 16 Python
python实现串口通信的示例代码
Feb 10 Python
在Python 的线程中运行协程的方法
Feb 24 Python
Python读取VOC中的xml目标框实例
Mar 10 Python
Python爬虫之Selenium实现窗口截图
Dec 04 Python
Python读写Excel表格的方法
Mar 02 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 set_time_limit(0) 设置程序执行时间的函数
2010/05/26 PHP
PHP下通过file_get_contents的代理使用方法
2011/02/16 PHP
PHP利用str_replace防注入的方法
2013/11/10 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
2015/05/12 PHP
php使用str_replace替换多维数组的实现方法分析
2017/06/15 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
setAttribute 与 class冲突解决
2008/02/17 Javascript
关于B/S判断浏览器断开的问题讨论
2008/10/29 Javascript
JS实现模拟风力的雪花飘落效果
2015/05/13 Javascript
jQuery解析Json实例详解
2015/11/24 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
jquery+css3问卷答题卡翻页动画效果示例
2016/10/26 Javascript
JS实现动态修改table及合并单元格的方法示例
2017/02/20 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
2017/03/27 Javascript
ExtJs异步无法向外传值和赋值的完美解决办法
2017/06/14 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
微信小程序获取用户绑定手机号方法示例
2019/07/21 Javascript
python的pdb调试命令的命令整理及实例
2017/07/12 Python
Python实现求笛卡尔乘积的方法
2017/09/16 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
Pandas标记删除重复记录的方法
2018/04/08 Python
python使用matplotlib绘制热图
2018/11/07 Python
python实现交并比IOU教程
2020/04/16 Python
一套软件开发工程师笔试题
2015/05/18 面试题
如何进行有效的自我评价
2013/09/27 职场文书
生产部岗位职责范文
2014/02/07 职场文书
分公司负责人任命书
2014/06/04 职场文书
小学学习雷锋活动总结
2014/07/03 职场文书
公司向个人借款协议书范本
2014/10/09 职场文书
大学生见习报告总结
2014/11/04 职场文书
教师考核评语大全
2014/12/31 职场文书
补充协议书
2015/01/28 职场文书
大学开学典礼新闻稿
2015/07/17 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server
python可视化之颜色映射详解
2021/09/15 Python