python3.6生成器yield用法实例分析


Posted in Python onAugust 23, 2019

本文实例讲述了python3.6生成器yield用法。分享给大家供大家参考,具体如下:

今天看源码的时候看到了一个比较有意思的函数:yield

功能与return类似,都是返回定义的函数的一个结果,不同的是return返回后这次调用函数就结束了,除了返回值,其余临时变量都会被清除。而yield会停止在当前步,并保留其余变量的值,等下次调用该函数时,从yield的下一步继续往下运行。

yield的好处是如果函数需要很大的内存,比方说需要计算并返回一个很大的数列,如果用return,我们只能用一个list来存储每一步再输出,而用yield的话,只需要一个变量的内存即可,每次输出当前步的值,下次调用函数接着从这一步继续。

文字不太好说明,看一个很容易理解的例子:(python3.6)

我们定义一个函数test(),看看return的效果

def test(n):
  for i in range(n):
    return i
    print('mark')

测试结果

for i in range(5):
  print(test(3))

输出

0
0
0
0
0

每次调用函数时碰到return就自动结束了,返回当前i值

再来看看yield的效果:

def test2(n):
  for i in range(n):
    yield i
    print('mark')

测试

for i in range(5):
  print(test2(3))

输出

<generator object test2 at 0x12d245200>
<generator object test2 at 0x12d245200>
<generator object test2 at 0x12d245200>

只要函数中含有yield,python就会默认这个函数是一个生成器,这个测试相当于重复打开了三次生成器

生成器需要用next()调用

测试

t = test2(3)
for i in range(3):
  print('i=',i)
  print(next(t))

next(t) 等同于 t.__next__()

结果

i= 0
0
i= 1
mark
1
i= 2
mark
2

可以看到,第一次返回i=0之后,第二次再调用函数时,从yield i的下一步继续,即print('mark')

生成器还支持用send()将值传递进函数:

def test3():
  value = (yield 1)
  print(value)
  print('mark1')
  value = (yield value)
  print(value)
  print('mark2')

测试

t2 = test3()
print(t2.__next__())
print('-----------')
print(t2.send(2))
print('-----------')
print(t2.send(3))

输出

1
-----------
2
mark1
2
-----------
3
mark2
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-102-56e62df29d71> in <module>()
      4 print(t2.send(2))
      5 print('-----------')
----> 6 print(t2.send(3))

StopIteration:

第一次next()返回1,并在当前停止,send(2)会将2传输给当前停止的那一步yield处,即相当于value = (yield 1)变为value = (2)

然后继续运行

print(value)
print('mark1')
value = (yield value)

碰到yield再次停止,返回此时的vlue值2,之后send(3)将3传输给当前停止那一步yield处,即第二个yield value处,继续运行

print(value)
print('mark2')

生成器运行结束后生成StopIteration

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python切换hosts文件代码示例
Dec 31 Python
Python常用模块介绍
Nov 21 Python
详解 Python 读写XML文件的实例
Aug 02 Python
浅谈django model postgres的json字段编码问题
Jan 05 Python
Python程序员面试题 你必须提前准备!(答案及解析)
Jan 23 Python
Python实现多条件筛选目标数据功能【测试可用】
Jun 13 Python
对Python 检查文件名是否规范的实例详解
Jun 10 Python
pycharm激活码有效到2020年11月底
Sep 18 Python
Python GUI自动化实现绕过验证码登录
Jan 10 Python
pycharm如何使用anaconda中的各种包(操作步骤)
Jul 31 Python
Python使用grequests并发发送请求的示例
Nov 05 Python
python图片合成的示例
Nov 09 Python
python基础 range的用法解析
Aug 23 #Python
Django 导出项目依赖库到 requirements.txt过程解析
Aug 23 #Python
Django接收自定义http header过程详解
Aug 23 #Python
Python 处理文件的几种方式
Aug 23 #Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
Aug 23 #Python
python @classmethod 的使用场合详解
Aug 23 #Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
Aug 23 #Python
You might like
php实现图片上传并进行替换操作
2016/03/15 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
jquery交替变换颜色的三种方法 实例代码
2013/11/19 Javascript
JS实现鼠标单击与双击事件共存
2014/03/08 Javascript
jQuery实现带分组数据的Table表头排序实例分析
2015/11/24 Javascript
浅析JavaScript Array和string的转换(推荐)
2016/05/20 Javascript
全面解析Bootstrap中nav、collapse的使用方法
2016/05/22 Javascript
jQuery 判断元素整理汇总
2017/02/28 Javascript
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
详解Vue文档中几个易忽视部分的剖析
2018/03/24 Javascript
vue+element实现打印页面功能
2019/05/20 Javascript
vue实现表单录入小案例
2019/09/27 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
2020/04/23 Javascript
[01:38]DOTA2辉夜杯 欢乐的观众现场采访
2015/12/26 DOTA
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
Python中关于使用模块的基础知识
2015/05/24 Python
举例讲解Python中的身份运算符的使用方法
2015/10/13 Python
基于python的Tkinter实现一个简易计算器
2015/12/31 Python
详解Python文本操作相关模块
2017/06/22 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
2017/08/05 Python
python2.7和NLTK安装详细教程
2018/09/19 Python
Python3 合并二叉树的实现
2019/09/30 Python
用python画一只可爱的皮卡丘实例
2019/11/21 Python
Python lxml模块的基本使用方法分析
2019/12/21 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
Django的ListView超详细用法(含分页paginate)
2020/05/21 Python
html5拖拽应用记录及注意点
2020/05/27 HTML / CSS
农村婚礼证婚词
2014/01/08 职场文书
新教师工作感言
2014/02/16 职场文书
静心口服夜广告词
2014/03/20 职场文书
班级旅游计划书
2014/05/03 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
城南旧事读书笔记
2015/06/29 职场文书
创业计划书之服装
2019/10/07 职场文书
浅谈JS和Nodejs中的事件驱动
2021/05/05 NodeJs