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字符遍历的艺术
Sep 06 Python
Python中使用PIL库实现图片高斯模糊实例
Feb 08 Python
Python中字典的基本知识初步介绍
May 21 Python
使用url_helper简化Python中Django框架的url配置教程
May 30 Python
Python中文竖排显示的方法
Jul 28 Python
python自动翻译实现方法
May 28 Python
Python实现计算两个时间之间相差天数的方法
May 10 Python
Python在groupby分组后提取指定位置记录方法
Apr 20 Python
使用python脚本实现查询火车票工具
Jul 19 Python
django如何通过类视图使用装饰器
Jul 24 Python
Python获取指定网段正在使用的IP
Dec 14 Python
分位数回归模型quantile regeression应用详解及示例教程
Nov 02 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
星际中的相关伤害
2020/03/04 星际争霸
PHP Curl出现403错误的解决办法
2014/05/29 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
2015/04/22 PHP
Laravel 5.3 学习笔记之 错误&amp;日志
2016/08/28 PHP
DOM相关内容速查手册
2007/02/07 Javascript
jQuery 相关控件的事件操作分解
2009/08/03 Javascript
jquery重复提交请求的原因浅析
2014/05/23 Javascript
js使用html()或text()方法获取设置p标签的显示的值
2014/08/01 Javascript
jQuery入门介绍之基础知识
2015/01/13 Javascript
BootStrap轻松实现微信页面开发代码分享
2016/10/21 Javascript
使用grunt合并压缩js和css文件的方法
2017/03/02 Javascript
webpack配置的最佳实践分享
2017/04/21 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
深入理解ES6之数据解构的用法
2018/01/13 Javascript
详解vue-admin和后端(flask)分离结合的例子
2018/02/12 Javascript
JS模拟实现哈希表及应用详解
2018/05/04 Javascript
clipboard.js在移动端复制失败的解决方法
2018/06/13 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
使用Python编写vim插件的简单示例
2015/04/17 Python
在Python中使用HTML模版的教程
2015/04/29 Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
老生常谈Python之装饰器、迭代器和生成器
2017/07/26 Python
django模型层(model)进行建表、查询与删除的基础教程
2017/11/21 Python
Tensorflow卷积神经网络实例进阶
2018/05/24 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
canvas画布实现手写签名效果的示例代码
2019/04/23 HTML / CSS
很酷的小工具和电子产品商城:GearBest
2016/11/19 全球购物
八一建军节演讲稿
2014/09/10 职场文书
CSS3实现指纹特效代码
2022/03/17 HTML / CSS
Java后端 Dubbo retries 超时重试机制的解决方案
2022/04/14 Java/Android