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+mysql实现简单的web程序
Sep 11 Python
python使用post提交数据到远程url的方法
Apr 29 Python
Python设计模式中单例模式的实现及在Tornado中的应用
Mar 02 Python
python itchat实现微信好友头像拼接图的示例代码
Aug 14 Python
Tensorflow 合并通道及加载子模型的方法
Jul 26 Python
python 使用sys.stdin和fileinput读入标准输入的方法
Oct 17 Python
python中import与from方法总结(推荐)
Mar 21 Python
Django之编辑时根据条件跳转回原页面的方法
Aug 21 Python
python tkinter组件使用详解
Sep 16 Python
基于python实现计算两组数据P值
Jul 10 Python
django inspectdb 操作已有数据库数据的使用步骤
Feb 07 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读取网页文件内容的实现代码(fopen,curl等)
2011/06/23 PHP
解析php时间戳与日期的转换
2013/06/06 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
2013/06/18 PHP
通过php添加xml文档内容的方法
2015/01/23 PHP
php绘制一个扇形的方法
2015/01/24 PHP
PHP中rename()函数的妙用讲解
2019/02/28 PHP
laravel通用化的CURD的实现
2019/12/13 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
javascript小数四舍五入多种方法实现
2012/12/23 Javascript
基于dom编程中 动态创建与删除元素的使用
2013/04/17 Javascript
javascript省市级联功能实现方法实例详解
2015/10/20 Javascript
Popup弹出框添加数据实现方法
2017/10/27 Javascript
JS打印彩色菱形的实例代码
2018/08/15 Javascript
Vue组件创建和传值的方法
2018/08/17 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
Python和GO语言实现的消息摘要算法示例
2015/03/10 Python
python使用xmlrpclib模块实现对百度google的ping功能
2015/06/02 Python
Ruby元编程基础学习笔记整理
2016/07/02 Python
基于python的图片修复程序(实现水印去除)
2018/06/04 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
python+selenium 点击单选框-radio的实现方法
2019/09/03 Python
python 监测内存和cpu的使用率实例
2019/11/28 Python
git查看、创建、删除、本地、远程分支方法详解
2020/02/18 Python
TensorFlow-gpu和opencv安装详细教程
2020/06/30 Python
通过Python实现Payload分离免杀过程详解
2020/07/13 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
2021/01/12 Python
荷兰和比利时时尚鞋店:Van Dalen
2018/04/23 全球购物
加拿大鞋网:Globo Shoes
2019/12/26 全球购物
新加坡第一的杂货零售商:NTUC FairPrice
2020/12/05 全球购物
快递业务员岗位职责
2014/01/06 职场文书
雪山饭庄的创业计划书范文
2014/01/18 职场文书
高中学生干部学习的自我评价
2014/02/21 职场文书
先进个人事迹材料
2014/12/29 职场文书
英文产品推荐信
2015/03/27 职场文书
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android
js前端面试常见浏览器缓存强缓存及协商缓存实例
2022/06/21 Javascript