python 如何区分return和yield


Posted in Python onSeptember 22, 2020

一、说明

return一直中,每中语言中其没没有很大差别,就不多说了。(shell语言return的是退出状态,可能差别是比较大的,感兴趣可参见“Linux Shell函数定义与调用”)

最早看到yield应该是哪们语言用来调整什么线程优先级的,记不清了,不过那里的yield和python中的yield应该功能有区别。

python中最早看到yield应该是使用scrapy框架写爬虫的时候,之前也有去看yiled的用法,总记不太住。今天又去看了一下,基本上来就是讲些斐波那契数列的烦的要死,自己写段程序研究了一下,这里记一下。

二、return和yield的异同

共同点:return和yield都用来返回值;在一次性地返回所有值场景中return和yield的作用是一样的。

不同点:如果要返回的数据是通过for等循环生成的迭代器类型数据(如列表、元组),return只能在循环外部一次性地返回,yeild则可以在循环内部逐个元素返回。下边我们举例说明这个不同点。

三、实例说明

3.1 return版本

示例代码如下:

class TestYield:
 def gen_iterator(self):
  result_list = []
  for j in range(3):
   print(f"gen_iterator-{j}")
   result_list.append(j)
  # return在循环的外部,待变量完全生成后一次性返回
  return result_list

 def call_gen_iterator(self):
  # 执行下边这句后result_list直接是完成的结果[0,1,2]
  result_list = self.gen_iterator()
  for i in result_list:
   print(f"call_gen_iterator-{i}")

if __name__ == "__main__":
 obj = TestYield()
 obj.call_gen_iterator()

执行结果如下,可以看到一次性执行完下层函数,生成完整的迭代器类型返回值result_list,一次性返回给上层函数:

python 如何区分return和yield

3.2 yield版本

示例代码如下:

class TestYield:
 def gen_iterator(self):
  for j in range(3):
   print(f"do_something-{j}")
   # yield在for循环内部
   yield j

 def call_gen_iterator(self):
  # yield并不是直接返回[0,1,2],执行下边这句后result_list什么值都没有
  result_list = self.gen_iterator()
  # i每请求一个数据,才会触发gen_iterator生成一个数据
  for i in result_list:
   print(f"call_gen_iterator-{i}")

if __name__ == "__main__":
 obj = TestYield()
 obj.call_gen_iterator()

执行结果如下,可以看到上下层函数是交替进行的,即上层函数请求迭代一个值下层函数才生成一个值并立即返回这个值:

python 如何区分return和yield

3.3 yield的意义

从上边两个小节可以看到,虽然return和yield两者执行的顺序有区别,但整个要做的事情是一样的,所以使用yield并不会比return快,甚至我们可以猜测由于yield总发生上下文切换在速度上还会慢一些,所以速度不是yield的意义。

他们的主要区别是yiled要迭代到哪个元素那个元素才即时地生成,而return要用一个中间变量result_list保存返回值,当result_list的长度很长且每个组成元素内容很大时将会耗费比较大的内存,此时yield相对return才有优势。

四、yield和return嵌套使用

class TestYield:
 def gen_iterator(self):
  for j in range(3):
   print(f"do_something-{j}")
   # yield在for循环内部
   yield j

 def gen_iterator_middle(self):
  print(f"gen_iterator_middle")
  # 返回的是迭代器的句柄,所以加一层return不影响是可以理解的
  return self.gen_iterator()

 def call_gen_iterator(self):
  # yield并不是直接返回[0,1,2],执行下边这句后result_list什么值都没有
  result_list = self.gen_iterator_middle()
  # i每请求一个数据,才会触发gen_iterator生成一个数据
  for i in result_list:
   print(f"call_gen_iterator-{i}")

if __name__ == "__main__":
 obj = TestYield()
 obj.call_gen_iterator()

python 如何区分return和yield

以上就是python 如何区分return和yield的详细内容,更多关于python return和yield的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python网页解析利器BeautifulSoup安装使用介绍
Mar 17 Python
用Python编写脚本使IE实现代理上网的教程
Apr 23 Python
Python合并两个字典的常用方法与效率比较
Jun 17 Python
对Tensorflow中的矩阵运算函数详解
Jul 27 Python
Python多线程应用于自动化测试操作示例
Dec 06 Python
几行Python代码爬取3000+上市公司的信息
Jan 24 Python
浅谈PYTHON 关于文件的操作
Mar 19 Python
django的csrf实现过程详解
Jul 26 Python
Python容器使用的5个技巧和2个误区总结
Sep 26 Python
Python运行提示缺少模块问题解决方案
Apr 02 Python
Python关键字及可变参数*args,**kw原理解析
Apr 04 Python
Python数组变形的几种实现方法
May 30 Python
Python中三维坐标空间绘制的实现
Sep 22 #Python
Pyinstaller打包Scrapy项目的实现步骤
Sep 22 #Python
Python使用pickle进行序列化和反序列化的示例代码
Sep 22 #Python
Python如何获取文件路径/目录
Sep 22 #Python
JupyterNotebook 输出窗口的显示效果调整实现
Sep 22 #Python
python 实现压缩和解压缩的示例
Sep 22 #Python
python 无损批量压缩图片(支持保留图片信息)的示例
Sep 22 #Python
You might like
PHP新手上路(四)
2006/10/09 PHP
PHP分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
2016/09/11 PHP
JavaScript面向对象(极简主义法minimalist approach)
2012/07/17 Javascript
利用JS延迟加载百度分享代码,提高网页速度
2013/07/01 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
2014/10/20 Javascript
基于javascript实现彩票随机数生成(升级版)
2020/04/17 Javascript
Javascript的表单验证-提交表单
2016/03/18 Javascript
Bootstrap超大屏幕的实现代码
2017/03/22 Javascript
关于vue.js v-bind 的一些理解和思考
2017/06/06 Javascript
Vue $mount实战之实现消息弹窗组件
2019/04/22 Javascript
Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解
2019/08/07 Javascript
[01:04]DOTA2:伟大的Roshan雕塑震撼来临
2015/01/30 DOTA
Django1.7+python 2.78+pycharm配置mysql数据库教程
2014/11/18 Python
Python操作MySQL简单实现方法
2015/01/26 Python
python批量生成本地ip地址的方法
2015/03/23 Python
python检测某个变量是否有定义的方法
2015/05/20 Python
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
在Python中增加和插入元素的示例
2018/11/01 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
用Python解决x的n次方问题
2019/02/08 Python
利用pyecharts实现地图可视化的例子
2019/08/12 Python
浅谈Python_Openpyxl使用(最全总结)
2019/09/05 Python
Python classmethod装饰器原理及用法解析
2020/10/17 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
法国房车租赁网站:Yescapa
2019/08/26 全球购物
国际贸易个人求职信范文
2014/01/04 职场文书
客户表扬信范文
2014/01/10 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
2014庆六一活动方案
2014/03/02 职场文书
共产党员承诺书
2014/03/25 职场文书
商场开业庆典策划方案
2014/06/02 职场文书
ktv好的活动方案
2014/08/15 职场文书
小学见习报告
2014/10/31 职场文书
大学社团活动总结怎么写
2019/06/21 职场文书