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 struct.unpack
Sep 06 Python
Python编程实现二分法和牛顿迭代法求平方根代码
Dec 04 Python
Python异常对代码运行性能的影响实例解析
Feb 08 Python
python 用正则表达式筛选文本信息的实例
Jun 05 Python
浅析Python 实现一个自动化翻译和替换的工具
Apr 14 Python
Django中reverse反转并且传递参数的方法
Aug 06 Python
django中media媒体路径设置的步骤
Nov 15 Python
pytorch 自定义卷积核进行卷积操作方式
Dec 30 Python
logging level级别介绍
Feb 21 Python
Tensorflow--取tensorf指定列的操作方式
Jun 30 Python
python爬虫爬取网页数据并解析数据
Sep 18 Python
opencv 分类白天与夜景视频的方法
Jun 05 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
晶体管来复再生式二管收音机
2021/03/02 无线电
PHP 开发环境配置(Zend Server安装)
2010/04/28 PHP
邮箱正则表达式实现代码(针对php)
2013/06/21 PHP
Eclipse PHPEclipse 配置的具体步骤
2017/08/08 PHP
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
2007/04/12 Javascript
自制轻量级仿jQuery.boxy对话框插件代码
2010/10/26 Javascript
P3P Header解决Cookie跨域的问题
2013/03/12 Javascript
jquery为页面增加快捷键示例
2014/01/31 Javascript
jquery制作弹窗提示窗口代码分享
2014/03/02 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
2015/06/18 Javascript
javascript闭包(Closure)用法实例简析
2015/11/30 Javascript
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
vue.js入门教程之基础语法小结
2016/09/01 Javascript
详解为Angular.js内置$http服务添加拦截器的方法
2016/12/20 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
layui关闭层级、简单监听的实例
2019/09/06 Javascript
vue实现PC端分辨率适配操作
2020/08/03 Javascript
浅谈python中的面向对象和类的基本语法
2016/06/13 Python
使用Python对Access读写操作
2017/03/30 Python
Python循环结构的应用场景详解
2019/07/11 Python
基于pytorch 预训练的词向量用法详解
2020/01/06 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
俄罗斯香水和化妆品网上商店:NOTINO.ru
2019/12/17 全球购物
北京一家公司的.net开发工程师笔试题
2012/04/17 面试题
项目计划书范文
2014/01/09 职场文书
装修致歉信
2014/01/15 职场文书
开办大学饮食联盟创业计划书
2014/01/29 职场文书
幼儿园六一活动总结
2014/08/27 职场文书
公司酒会致辞
2015/07/30 职场文书
详解Vue的options
2021/05/15 Vue.js
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android
Python函数式编程中itertools模块详解
2021/09/15 Python
HTML+JS实现在线朗读器
2022/02/15 Javascript