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基于xmlrpc实现二进制文件传输的方法
Jun 02 Python
Python实现获取命令行输出结果的方法
Jun 10 Python
python 通过xml获取测试节点和属性的实例
Mar 31 Python
python提取图像的名字*.jpg到txt文本的方法
May 10 Python
Python 爬虫之Beautiful Soup模块使用指南
Jul 05 Python
Python告诉你木马程序的键盘记录原理
Feb 02 Python
Python supervisor强大的进程管理工具的使用
Apr 24 Python
Django中celery执行任务结果的保存方法
Jul 12 Python
python的命名规则知识点总结
Oct 04 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
Mar 02 Python
Python基于正则表达式实现计算器功能
Jul 13 Python
Python通用验证码识别OCR库ddddocr的安装使用教程
Jul 07 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中一个控制字符串输出的函数
2006/10/09 PHP
php 显示指定路径下的图片
2009/10/29 PHP
php文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
深入解析php中的foreach问题
2013/06/30 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
2020/03/18 PHP
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
在JavaScript应用中实现延迟加载的方法
2015/06/25 Javascript
jquery中cookie用法实例详解(获取,存储,删除等)
2016/01/04 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
Vue动态路由缓存不相互影响的解决办法
2019/02/19 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
微信小程序云开发实现云数据库读写权限
2019/05/17 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
Vue Router 实现动态路由和常见问题及解决方法
2020/03/06 Javascript
理解JavaScript中的对象
2020/08/25 Javascript
[00:12]DAC2018 Miracle-站上中单舞台,他能否再写奇迹?
2018/04/06 DOTA
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
Python itertools模块详解
2015/05/09 Python
用python标准库difflib比较两份文件的异同详解
2018/11/16 Python
Python中dict和set的用法讲解
2019/03/28 Python
Python绘制热力图示例
2019/09/27 Python
Python算法中的时间复杂度问题
2019/11/19 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
python中数字是否为可变类型
2020/07/08 Python
HTML5网页录音和上传到服务器支持PC、Android,支持IOS微信功能
2019/04/26 HTML / CSS
ZWILLING双立人英国网上商店:德国刀具锅具厨具品牌
2018/05/15 全球购物
Street One瑞士:德国现代时装公司
2019/10/09 全球购物
俄罗斯三星品牌商店:GalaxyStore
2020/11/04 全球购物
妇女干部培训方案
2014/05/12 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
遗愿清单观后感
2015/06/09 职场文书
现实表现证明材料
2015/06/19 职场文书
javascript的setTimeout()使用方法总结
2021/11/20 Javascript
使用Java去实现超市会员管理系统
2022/03/18 Java/Android