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 相关文章推荐
pygame学习笔记(6):完成一个简单的游戏
Apr 15 Python
Python中使用Queue和Condition进行线程同步的方法
Jan 19 Python
python TCP Socket的粘包和分包的处理详解
Feb 09 Python
Python 读写文件的操作代码
Sep 20 Python
Python 限制线程的最大数量的方法(Semaphore)
Feb 22 Python
将pip源更换到国内镜像的详细步骤
Apr 07 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
Jun 08 Python
python 利用pyttsx3文字转语音过程详解
Sep 25 Python
浅谈Django2.0 加xadmin踩的坑
Nov 15 Python
python3 实现函数写文件路径的正确方法
Nov 27 Python
基于python traceback实现异常的获取与处理
Dec 13 Python
Python Selenium操作Cookie的实例方法
Feb 28 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
第十三节--对象串行化
2006/11/16 PHP
phpStudy配置多站点多域名和多端口的方法
2017/09/01 PHP
javascript中巧用“闭包”实现程序的暂停执行功能
2007/04/04 Javascript
JavaScript 学习笔记二 字符串拼接
2010/03/28 Javascript
javascript获取鼠标点击元素对象(示例代码)
2013/12/20 Javascript
node.js中的path.isAbsolute方法使用说明
2014/12/08 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
2015/08/04 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
页面缩放兼容性处理方法(zoom,Firefox火狐浏览器)
2017/08/29 Javascript
微信小程序画布圆形进度条显示效果
2020/11/17 Javascript
详解vue.js根据不同环境(正式、测试)打包到不同目录
2018/07/13 Javascript
JS中使用new Option()实现时间联动效果
2018/12/10 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
[56:58]VP vs Optic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[01:26]神话结束了,却也刚刚开始——DOTA2新英雄玛尔斯驾临战场
2019/03/10 DOTA
python网页请求urllib2模块简单封装代码
2014/02/07 Python
使用Python的Tornado框架实现一个简单的WebQQ机器人
2015/04/24 Python
Python利用ansible分发处理任务
2015/08/04 Python
Python中json格式数据的编码与解码方法详解
2016/07/01 Python
windows下安装Python和pip终极图文教程
2017/03/05 Python
Python处理CSV与List的转换方法
2018/04/19 Python
python中的tcp示例详解
2018/12/09 Python
python字典的遍历3种方法详解
2019/08/10 Python
python生成requirements.txt的两种方法
2019/09/18 Python
python基于event实现线程间通信控制
2020/01/13 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
2020/04/30 Python
Python爬虫HTPP请求方法有哪些
2020/06/03 Python
python opencv pytesseract 验证码识别的实现
2020/08/28 Python
2014年3.15团委活动总结
2014/03/16 职场文书
《莫泊桑拜师》教学反思
2014/04/23 职场文书
群众路线教师自我剖析材料
2014/09/29 职场文书
毕业生班级鉴定评语
2015/01/04 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS