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中用pycurl监控http响应时间脚本分享
Feb 02 Python
python实现在windows服务中新建进程的方法
Jun 30 Python
Python面向对象特殊成员
Apr 24 Python
python实现unicode转中文及转换默认编码的方法
Apr 29 Python
python+selenium实现京东自动登录及秒杀功能
Nov 18 Python
简单了解Python matplotlib线的属性
Jun 29 Python
python利用dlib获取人脸的68个landmark
Nov 27 Python
Flask 上传自定义头像的实例详解
Jan 09 Python
Python xlrd模块导入过程及常用操作
Jun 10 Python
Python如何自动获取目标网站最新通知
Jun 18 Python
Python迭代器协议及for循环工作机制详解
Jul 14 Python
用60行代码实现Python自动抢微信红包
Feb 04 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
IIS环境下快速安装、配置和调试PHP5.2.0
2006/12/17 PHP
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
2020/05/15 PHP
Jquery实现列表(隔行换色,全选,鼠标滑过当前行)效果实例
2013/06/09 Javascript
Javascript对象Clone实例分析
2015/06/09 Javascript
javascript中判断json的方法总结
2015/08/27 Javascript
AngularJS中实现显示或隐藏动画效果的方式总结
2015/12/31 Javascript
Bootstrap创建可折叠的组件
2016/02/23 Javascript
Bootstrap每天必学之导航组件
2016/04/25 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
js仿网易表单及时验证功能
2017/03/07 Javascript
详解微信第三方小程序代开发
2017/06/23 Javascript
详谈js对url进行编码和解码(三种方式的区别)
2017/08/16 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
JavaScript工具库之Lodash详解
2019/06/15 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
2019/11/09 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
js实现无缝轮播图
2020/03/09 Javascript
vue项目中使用bpmn为节点添加颜色的方法
2020/04/30 Javascript
小程序自定义弹框效果
2020/11/16 Javascript
[35:44]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG
2014/05/26 DOTA
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
2016/06/13 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
2018/06/11 Python
使用python os模块复制文件到指定文件夹的方法
2019/08/22 Python
css3 transform导致子元素固定定位变成绝对定位的方法
2020/03/06 HTML / CSS
草莓网中国:StrawberryNet中国
2020/08/17 全球购物
亚马逊意大利站点:Amazon.it
2020/12/31 全球购物
土木建筑学生自我评价
2014/01/14 职场文书
八年级美术教学反思
2014/02/02 职场文书
小学教师评语大全
2014/04/23 职场文书
详解 TypeScript 枚举类型
2021/11/02 Javascript
关于maven依赖 ${xxx.version}报错问题
2022/01/18 Java/Android