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中利用sqrt()方法进行平方根计算的教程
May 15 Python
Python 25行代码实现的RSA算法详解
Apr 10 Python
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 Python
python使用Matplotlib画饼图
Sep 25 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
May 10 Python
详解python调用cmd命令三种方法
Jul 08 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
Sep 04 Python
Eclipse配置python默认头过程图解
Apr 26 Python
Python代码中如何读取键盘录入的值
May 27 Python
python框架flask入门之环境搭建及开启调试
Jun 07 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
Jul 03 Python
PyQt5多线程防卡死和多窗口用法的实现
Sep 15 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中使用CURL伪造来路抓取页面或文件
2011/05/04 PHP
php对关联数组循环遍历的实现方法
2015/03/13 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
JavaScript ECMA-262-3 深入解析.第三章.this
2011/09/28 Javascript
jquery ajax的success回调函数中实现按钮置灰倒计时
2013/11/19 Javascript
Backbone.js中的集合详解
2015/01/14 Javascript
javascript控制图片播放的实现代码
2020/07/29 Javascript
node.js require() 源码解读
2015/12/13 Javascript
使用jquery提交form表单并自定义action的方法
2016/05/25 Javascript
jQuery基于xml格式数据实现模糊查询及分页功能的方法
2016/12/25 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
2017/05/09 Javascript
react+redux的升级版todoList的实现
2017/12/18 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
JavaScript实现的拼图算法分析
2019/02/13 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
Python实现的一个自动售饮料程序代码分享
2014/08/25 Python
基于使用paramiko执行远程linux主机命令(详解)
2017/10/16 Python
Python实现PS滤镜的旋转模糊功能示例
2018/01/20 Python
Centos下实现安装Python3.6和Python2共存
2018/08/15 Python
Python实现正则表达式匹配任意的邮箱方法
2018/12/20 Python
Django数据库连接丢失问题的解决方法
2018/12/29 Python
Tensorflow 实现释放内存
2020/02/03 Python
使用Python实现批量ping操作方法
2020/05/06 Python
Keras搭建自编码器操作
2020/07/03 Python
python字典按照value排序方法
2020/12/28 Python
Python3压缩和解压缩实现代码
2021/03/01 Python
中国高端家电购物商城:顺电
2018/03/04 全球购物
应届生污水处理求职信
2013/11/06 职场文书
新学期红领巾广播稿
2014/01/14 职场文书
写得不错的求职信范文
2014/07/11 职场文书
五心教育心得体会
2014/09/04 职场文书
作弊检讨书范文
2015/05/06 职场文书
运动会通讯稿100字
2015/07/20 职场文书
dubbo集成zipkin获取Traceid的实现
2021/07/26 Java/Android
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
2022/06/14 Golang