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版
Dec 07 Python
python实现得到一个给定类的虚函数
Sep 28 Python
举例讲解Python面向对象编程中类的继承
Jun 17 Python
python中的print()输出
Apr 12 Python
梅尔倒谱系数(MFCC)实现
Jun 19 Python
Python2和3字符编码的区别知识点整理
Aug 08 Python
python实现BP神经网络回归预测模型
Aug 09 Python
Flask之pipenv虚拟环境的实现
Nov 26 Python
将pytorch转成longtensor的简单方法
Feb 18 Python
Python chardet库识别编码原理解析
Feb 18 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
May 11 Python
python中的插入排序的简单用法
Jan 19 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
DISCUZ 论坛管理员密码忘记的解决方法
2009/05/14 PHP
用PHP获取Google AJAX Search API 数据的代码
2010/03/12 PHP
php表单请求获得数据求和示例
2014/05/15 PHP
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
2014/09/29 PHP
php获取根域名方法汇总
2014/10/28 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
javascript使用location.search的示例
2013/11/05 Javascript
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
浅谈JavaScript function函数种类
2014/12/29 Javascript
js中this用法实例详解
2015/05/05 Javascript
JSON简介以及用法汇总
2016/02/21 Javascript
vue2.0使用swiper组件实现轮播效果
2017/11/27 Javascript
详解jQuery中的easyui
2018/09/02 jQuery
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
2019/11/26 Javascript
JS实现音乐钢琴特效
2020/01/06 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
python+requests+unittest API接口测试实例(详解)
2017/06/10 Python
Python 实现淘宝秒杀的示例代码
2018/01/02 Python
用python做游戏的细节详解
2019/06/25 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
详解python中docx库的安装过程
2019/11/08 Python
Python 静态方法和类方法实例分析
2019/11/21 Python
Python类的继承super相关原理解析
2020/10/22 Python
python定时截屏实现
2020/11/02 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
2021/01/15 Python
CSS3实现大小不一的粒子旋转加载动画
2016/04/21 HTML / CSS
蔻驰西班牙官网:COACH西班牙
2019/01/16 全球购物
印度尼西亚最完整和最大的在线药房网站:Farmaku.com
2019/11/23 全球购物
最畅销的视频游戏享受高达90%的折扣:CDKeys
2020/02/10 全球购物
简短证婚人证婚词
2014/01/09 职场文书
争先创优公开承诺书
2014/08/30 职场文书
邀请函格式范文
2015/02/02 职场文书
2015年结对帮扶工作总结
2015/05/04 职场文书