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中的字符串操作和编码Unicode详解
Jan 18 Python
Python及Django框架生成二维码的方法分析
Jan 31 Python
opencv改变imshow窗口大小,窗口位置的方法
Apr 02 Python
Python中defaultdict与lambda表达式用法实例小结
Apr 09 Python
Python的argparse库使用详解
Oct 09 Python
Python元组知识点总结
Feb 18 Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 Python
Django认证系统实现的web页面实现代码
Aug 12 Python
python的pip有什么用
Jun 17 Python
利用Python pandas对Excel进行合并的方法示例
Nov 04 Python
python 爬取百度文库并下载(免费文章限定)
Dec 04 Python
python接口测试返回数据为字典取值方式
Feb 12 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 Hash函数,增强密码安全
2011/02/25 PHP
ThinkPHP CURD方法之data方法详解
2014/06/18 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
2014/06/30 PHP
PHP实现获取客户端IP并获取IP信息
2015/03/17 PHP
wamp服务器访问php非常缓慢的解决过程
2015/07/01 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
在javascript将NodeList作为Array数组处理的方法
2010/07/09 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
搭建vue开发环境
2018/07/19 Javascript
JS实现简单省市二级联动
2019/11/27 Javascript
JavaScript多种滤镜算法实现代码实例
2019/12/10 Javascript
js实现select下拉框选择
2020/01/11 Javascript
[02:56]DOTA2亚洲邀请赛 VG出场战队巡礼
2015/02/07 DOTA
python、java等哪一门编程语言适合人工智能?
2017/11/13 Python
Python快速排序算法实例分析
2017/11/29 Python
python使用PIL模块获取图片像素点的方法
2019/01/08 Python
python爬取基于m3u8协议的ts文件并合并
2019/04/26 Python
使用WingPro 7 设置Python路径的方法
2019/07/24 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
Python list运算操作代码实例解析
2020/01/20 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
详解KMP算法以及python如何实现
2020/09/18 Python
Python+OpenCV图像处理——实现轮廓发现
2020/10/23 Python
Amara德国:家居饰品、设计师品牌和豪华礼品
2019/05/20 全球购物
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
成人毕业生自我鉴定
2013/10/18 职场文书
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
先进学校事迹材料
2014/12/30 职场文书
MBA推荐信怎么写
2015/03/25 职场文书
2015年幼儿园中班工作总结
2015/04/25 职场文书
安全生产感想
2015/08/07 职场文书
MySQL 原理与优化之原数据锁的应用
2022/08/14 MySQL