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实现在pickling的时候压缩的方法
Sep 25 Python
KMP算法精解及其Python版的代码示例
Jun 01 Python
Python3.5 Pandas模块之DataFrame用法实例分析
Apr 23 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
Jul 14 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
Jan 14 Python
python实现门限回归方式
Feb 29 Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
Mar 20 Python
如何理解Python中包的引入
May 29 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
Sep 23 Python
python matplotlib库的基本使用
Sep 23 Python
python opencv人脸识别考勤系统的完整源码
Apr 26 Python
Python写情书? 10行代码展示如何把情书写在她的照片里
Apr 21 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 一个比较完善的简单文件上传
2010/03/25 PHP
php数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
php实现下载限制速度示例分享
2014/02/13 PHP
PHP ajax 异步执行不等待执行结果的处理方法
2015/05/27 PHP
php抓取并保存网站图片的实现代码
2015/10/28 PHP
ThinkPHP5&amp;5.1框架关联模型分页操作示例
2019/08/03 PHP
jQuery 可以拖动的div实现代码 脚本之家修正版
2009/06/26 Javascript
JavaScript打字小游戏代码
2011/12/26 Javascript
jquery 触发a链接点击事件解决方案
2013/05/02 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2014/09/04 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
js学习之----深入理解闭包
2016/11/21 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
js 只比较时间大小的实例
2017/10/26 Javascript
webpack下实现动态引入文件方法
2018/02/22 Javascript
js设置鼠标悬停改变背景色实现详解
2019/06/26 Javascript
Servlet返回的数据js解析2种方法
2019/12/12 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
[36:33]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第二场
2018/04/04 DOTA
详解Python中内置的NotImplemented类型的用法
2015/03/31 Python
python对html代码进行escape编码的方法
2015/05/04 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
Python中利用xpath解析HTML的方法
2018/05/14 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
Python基于httpx模块实现发送请求
2020/07/07 Python
美国社交购物市场:MassGenie
2019/02/18 全球购物
大学生物业管理求职信
2013/10/24 职场文书
学生自我鉴定
2013/12/18 职场文书
公司业务员岗位职责
2014/03/18 职场文书
调研汇报材料范文
2014/08/17 职场文书
2016年秋季新学期致辞
2015/07/30 职场文书
2019公司借款合同范本2篇!
2019/07/24 职场文书
不知如何爱孩子,这些方法教会您
2019/08/06 职场文书
golang switch语句的灵活写法介绍
2021/05/06 Golang
Mysql 设置boolean类型的操作
2021/06/04 MySQL