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抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
Feb 23 Python
python利用Opencv实现人脸识别功能
Apr 25 Python
django的model操作汇整详解
Jul 26 Python
Python CVXOPT模块安装及使用解析
Aug 01 Python
python 单线程和异步协程工作方式解析
Sep 28 Python
Python3并发写文件与Python对比
Nov 20 Python
使用python-pptx包批量修改ppt格式的实现
Feb 14 Python
python实现TCP文件传输
Mar 20 Python
Python configparser模块操作代码实例
Jun 08 Python
全网最详细的PyCharm+Anaconda的安装过程图解
Jan 25 Python
对Pytorch 中的contiguous理解说明
Mar 03 Python
深入理解python协程
Jun 15 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小程序自动提交到自助友情连接
2009/11/24 PHP
php正则修正符用法实例详解
2016/12/29 PHP
javascript 操作Word和Excel的实现代码
2009/10/26 Javascript
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
css值转换成数值请抛弃parseInt
2011/10/24 Javascript
jquery实现select选中行、列合计示例
2014/04/25 Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
2015/01/26 Javascript
推荐一个自己用的封装好的javascript插件
2015/01/29 Javascript
Bootstrap响应式导航由768px变成992px的实现代码
2017/06/15 Javascript
关于vue.js组件数据流的问题
2017/07/26 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
[04:40]DOTA2-DPC中国联赛1月26日Recap集锦
2021/03/11 DOTA
go和python调用其它程序并得到程序输出
2014/02/10 Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
2018/02/13 Python
对python 读取线的shp文件实例详解
2018/12/22 Python
Python中常用的内置方法
2019/01/28 Python
python db类用法说明
2020/07/07 Python
iframe跨域的几种常用方法
2019/11/11 HTML / CSS
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
施华洛世奇匈牙利官网:SWAROVSKI匈牙利
2019/07/06 全球购物
英国知名小木屋定制网站:Tiger Sheds
2020/03/06 全球购物
后勤园长自我鉴定
2013/10/17 职场文书
函授自我鉴定
2013/11/06 职场文书
医学专业大学生求职的自我评价
2013/11/27 职场文书
讲座主持词
2014/03/20 职场文书
文明演讲稿范文
2014/05/12 职场文书
大学生学习新党章思想汇报
2014/10/25 职场文书
师德承诺书
2015/01/20 职场文书
事业单位财务人员岗位职责
2015/04/14 职场文书
总经理年会致辞
2015/07/29 职场文书
美容院员工规章制度
2015/08/05 职场文书
http通过StreamingHttpResponse完成连续的数据传输长链接方式
2022/02/12 Python
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫
Mac电脑OS系统下安装Nginx的详细教程
2022/04/14 Servers