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的Flask框架中使用日期和时间的教程
Apr 21 Python
python清除字符串里非字母字符的方法
Jul 02 Python
Python迭代和迭代器详解
Nov 10 Python
python+selenium实现京东自动登录及秒杀功能
Nov 18 Python
python最长回文串算法
Jun 04 Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 Python
python 实现一次性在文件中写入多行的方法
Jan 28 Python
tensorflow如何批量读取图片
Aug 29 Python
使用Python制作一个打字训练小工具
Oct 01 Python
Python下利用BeautifulSoup解析HTML的实现
Jan 17 Python
python函数调用,循环,列表复制实例
May 03 Python
Python基于Socket实现简易多人聊天室的示例代码
Nov 29 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
一个数据采集类
2007/02/14 PHP
PHP的变量总结 新手推荐
2011/04/18 PHP
PHP 转义使用详解
2013/07/15 PHP
Codeigniter发送邮件的方法
2015/03/19 PHP
列举PHP的Yii 2框架的开发优势
2015/07/03 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
防止xss和sql注入:JS特殊字符过滤正则
2013/04/18 Javascript
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
纯JS实现根据CSS的class选择DOM
2014/03/22 Javascript
跟我学习javascript的异步脚本加载
2015/11/20 Javascript
jQuery点击改变class并toggle及toggleClass()方法定义用法
2015/12/11 Javascript
分享我对JS插件开发的一些感想和心得
2016/02/04 Javascript
javaScript中封装的各种写法示例(推荐)
2017/07/03 Javascript
强大的JavaScript响应式图表Chartist.js的使用
2017/09/13 Javascript
nodejs发送http请求时遇到404长时间未响应的解决方法
2017/12/10 NodeJs
使用typescript开发angular模块并发布npm包
2018/04/19 Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
2018/08/01 Javascript
使用异步组件优化Vue应用程序的性能
2019/04/28 Javascript
通过数据库向Django模型添加字段的示例
2015/07/21 Python
利用Python爬取可用的代理IP
2016/08/18 Python
Python获取当前公网ip并自动断开宽带连接实例代码
2018/01/12 Python
浅析Python 引号、注释、字符串
2019/07/25 Python
OpenCV+Python--RGB转HSI的实现
2019/11/27 Python
浅析python函数式编程
2020/09/26 Python
Python实现邮件发送的详细设置方法(遇到问题)
2021/01/18 Python
小蚁科技官方商店:YI Technology
2019/08/23 全球购物
EJB3.1都有哪些改进
2012/11/17 面试题
求职简历中自我评价
2014/01/28 职场文书
公司员工检讨书
2014/02/08 职场文书
《红军不怕远征难》教学反思
2014/04/14 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
农业局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
学校运动会广播稿
2014/10/11 职场文书
农村婚礼司仪主持词
2015/06/29 职场文书
创业计划书之宠物店
2019/09/19 职场文书
十一月早安语录:把心放轻,人生就是一朵自在的云
2019/11/04 职场文书