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中迭代器(iterator)用法实例分析
Apr 29 Python
解读! Python在人工智能中的作用
Nov 14 Python
python 实现矩阵上下/左右翻转,转置的示例
Jan 23 Python
我喜欢你 抖音表白程序python版
Apr 07 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
Apr 27 Python
Python猴子补丁知识点总结
Jan 05 Python
基于python图像处理API的使用示例
Apr 03 Python
Python3爬虫中关于中文分词的详解
Jul 29 Python
Python Web项目Cherrypy使用方法镜像
Nov 05 Python
selenium+python实现基本自动化测试的示例代码
Jan 27 Python
Python操作CSV格式文件的方法大全
Jul 15 Python
python Tkinter模块使用方法详解
Apr 07 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类 可以参考学习熟悉下
2009/06/21 PHP
分割GBK中文遭遇乱码的解决方法
2013/08/09 PHP
phpStudy访问速度慢和启动失败的解决办法
2015/11/19 PHP
微信第三方登录(原生)demo【必看篇】
2017/05/26 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
2018/04/21 PHP
yii2 在控制器中验证请求参数的使用方法
2019/06/19 PHP
解读IE和firefox下JScript和HREF的执行顺序
2008/01/12 Javascript
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
js获取url中&quot;?&quot;后面的字串方法
2014/05/15 Javascript
js中iframe调用父页面的方法
2014/10/30 Javascript
node.js中的fs.lchownSync方法使用说明
2014/12/16 Javascript
jQuery简单实现验证邮箱格式
2015/07/15 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
2015/11/29 Javascript
使用vue.js制作分页组件
2016/06/27 Javascript
canvas 实现中国象棋
2017/02/17 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
详解使用vue实现tab 切换操作
2017/07/03 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
2017/07/12 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
发布一款npm包帮助理解npm的使用
2019/01/03 Javascript
微信小程序BindTap快速连续点击目标页面跳转多次问题处理
2019/04/08 Javascript
vuex 中插件的编写案例解析
2019/06/10 Javascript
微信小程序实现蓝牙打印
2019/09/23 Javascript
python编程开发之textwrap文本样式处理技巧
2015/11/13 Python
Python实现的栈(Stack)
2018/01/26 Python
Python实现爬虫从网络上下载文档的实例代码
2018/06/13 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
Django后台admin的使用详解
2019/07/08 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
2020/09/23 Python
python tkinter实现连连看游戏
2020/11/16 Python
装修致歉信
2014/01/15 职场文书
有关打架的检讨书
2014/01/25 职场文书
法律专业求职信
2014/05/24 职场文书
民主评议政风行风活动心得体会
2014/10/29 职场文书
2015年检验科工作总结
2015/04/27 职场文书
残联2016年全国助残日活动总结
2016/04/01 职场文书