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中pygame模块用法实例
Oct 09 Python
Python标准库内置函数complex介绍
Nov 25 Python
讲解Python中if语句的嵌套用法
May 14 Python
用Python的Django框架来制作一个RSS阅读器
Jul 22 Python
python中numpy包使用教程之数组和相关操作详解
Jul 30 Python
Python中常用的内置方法
Jan 28 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
Feb 26 Python
Python函数和模块的使用总结
May 20 Python
Python中常用的高阶函数实例详解
Feb 21 Python
Python 改变数组类型为uint8的实现
Apr 09 Python
Eclipse配置python默认头过程图解
Apr 26 Python
Python 爬虫的原理
Jul 30 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实现MySQL更新记录的代码
2008/06/07 PHP
分享自定义的几个PHP功能函数
2015/04/15 PHP
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
JS的IE和Firefox兼容性集锦
2006/12/11 Javascript
jQuery实现tag便签去重效果的方法
2015/01/20 Javascript
javascript 数组操作详解
2015/01/29 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
jquery中JSON的解析方式
2015/03/16 Javascript
jQuery EasyUI常用数据验证汇总
2016/09/18 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
2016/11/15 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
2016/11/22 Javascript
jQuery实现对象转为url参数的方法
2017/01/11 Javascript
AngularJS路由切换实现方法分析
2017/03/17 Javascript
关于axios如何全局注册浅析
2018/01/14 Javascript
javascript实现手动点赞效果
2019/04/09 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
2020/08/12 Javascript
Vue 的 v-model用法实例
2020/11/23 Vue.js
[05:01]3.19DOTA2发布会 我们都是刀塔人
2014/03/25 DOTA
跟老齐学Python之Python文档
2014/10/10 Python
Python列表计数及插入实例
2014/12/17 Python
Python之用户输入的实例
2018/06/22 Python
在python里协程使用同步锁Lock的实例
2019/02/19 Python
详解python项目实战:模拟登陆CSDN
2019/04/04 Python
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
2020/10/04 Python
基于pycharm 项目和项目文件命名规则的介绍
2021/01/15 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
2021/01/22 Python
荷兰皇家航空公司中国官网:KLM中国
2017/12/13 全球购物
翻新二手苹果产品的网络领导者:Mac of all Trades
2017/12/19 全球购物
市场营销管理制度
2014/01/29 职场文书
幼儿园校车司机的岗位职责
2014/01/30 职场文书
总经理岗位职责描述
2014/02/08 职场文书
大三学年自我鉴定范文(3篇)
2014/09/28 职场文书
乒乓球比赛通知
2015/04/27 职场文书
如何写好活动总结
2019/06/21 职场文书