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 相关文章推荐
Python3通过Luhn算法快速验证信用卡卡号的方法
May 14 Python
举例讲解如何在Python编程中进行迭代和遍历
Jan 19 Python
Python上下文管理器用法及实例解析
Nov 11 Python
Python面向对象之私有属性和私有方法应用案例分析
Dec 31 Python
Python常用模块sys,os,time,random功能与用法实例分析
Jan 07 Python
使用TensorFlow直接获取处理MNIST数据方式
Feb 10 Python
Python API len函数操作过程解析
Mar 05 Python
Python学习之os模块及用法
Jun 03 Python
Python headers请求头如何实现快速添加
Nov 03 Python
Python通过字典映射函数实现switch
Nov 06 Python
Python 线程池模块之多线程操作代码
May 20 Python
Python+Matplotlib+LaTeX玩转数学公式
Feb 24 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
Yii查询生成器(Query Builder)用法实例教程
2014/09/04 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
ThinkPHP5 验证器的具体使用
2018/05/31 PHP
php成功操作redis cluster集群的实例教程
2019/01/13 PHP
php gethostbyname获取域名ip地址函数详解
2010/01/24 Javascript
document.documentElement的一些使用技巧
2013/04/18 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
详解AngularJS的通信机制
2015/06/18 Javascript
JS+CSS实现精美的二级导航效果代码
2015/09/17 Javascript
AngularJS 模块详解及简单实例
2016/07/28 Javascript
Bootstrap源码解读导航(6)
2016/12/23 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
2017/03/30 Javascript
AngularJS折叠菜单实现方法示例
2017/05/18 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
详解Angular系列之变化检测(Change Detection)
2018/02/26 Javascript
node的process以及child_process模块学习笔记
2018/03/06 Javascript
9102年webpack4搭建vue项目的方法步骤
2019/02/20 Javascript
微信小程序新闻网站详情页实例代码
2020/01/10 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
[02:30]DOTA2英雄基础教程 暗影恶魔
2013/12/17 DOTA
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
python flask 如何修改默认端口号的方法步骤
2019/07/12 Python
简单易懂Pytorch实战实例VGG深度网络
2019/08/27 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
Python3 集合set入门基础
2020/02/10 Python
Python3 hashlib密码散列算法原理详解
2020/03/30 Python
Pycharm github配置实现过程图解
2020/10/13 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
兰蔻加拿大官方网站:Lancome加拿大
2016/08/05 全球购物
全天然狗零食:Best Bully Sticks
2016/09/22 全球购物
企业厂长岗位职责
2013/12/17 职场文书
2014年旅游局法制宣传日活动总结
2014/11/01 职场文书
介绍信怎么写
2015/01/30 职场文书
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript
微信小程序调用python模型
2022/04/21 Python