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改变日志(logging)存放位置的示例
Mar 27 Python
python批量提交沙箱问题实例
Oct 08 Python
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
May 05 Python
Python编写一个闹钟功能
Jul 11 Python
python计算两个数的百分比方法
Jun 29 Python
python实现贪吃蛇游戏
Mar 21 Python
django框架使用orm实现批量更新数据的方法
Jun 21 Python
Django中自定义模型管理器(Manager)及方法
Sep 23 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
Oct 17 Python
Python调用Windows API函数编写录音机和音乐播放器功能
Jan 05 Python
tensorflow 变长序列存储实例
Jan 20 Python
django表单中的按钮获取数据的实例分析
Jul 31 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导入模块文件分享
2015/03/17 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
Javascript 陷阱 window全局对象
2008/11/26 Javascript
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
JS 添加网页桌面快捷方式的代码详细整理
2012/12/27 Javascript
JavaScript实现QueryString获取GET参数的方法
2013/07/02 Javascript
Js nodeType 属性全面解析
2013/11/14 Javascript
Javascript获取当前时间函数和时间操作小结
2014/10/01 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
使用AngularJS对路由进行安全性处理的方法
2015/06/18 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
浅谈angularJS中的事件
2016/07/12 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
使用D3.js构建实时图形的示例代码
2018/08/28 Javascript
python mysqldb连接数据库
2009/03/16 Python
Python开发的单词频率统计工具wordsworth使用方法
2014/06/25 Python
Python获取系统所有进程PID及进程名称的方法示例
2018/05/24 Python
Python subprocess模块常见用法分析
2018/06/12 Python
pycharm配置当鼠标悬停时快速提示方法参数
2019/07/31 Python
万宝龙英国官网:Montblanc手表、书写工具、皮革和珠宝
2018/10/16 全球购物
沃尔玛旗下墨西哥超市:Bodega Aurrera
2020/11/13 全球购物
介绍一下EJB的体系结构
2012/08/01 面试题
人事行政主管岗位职责
2013/12/22 职场文书
总经理文秘岗位职责
2014/02/03 职场文书
银行委托书范本
2014/04/04 职场文书
高中学生期末评语
2014/04/25 职场文书
紧急通知
2015/04/17 职场文书
2015年农村党员公开承诺事项
2015/04/28 职场文书
2015年加油站工作总结
2015/05/13 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书
网络营销实训总结
2015/08/03 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
PHP实现rar解压读取扩展包小结
2021/06/03 PHP
vue动态绑定style样式
2022/04/20 Vue.js