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迭代器和生成器介绍
Mar 06 Python
探究Python多进程编程下线程之间变量的共享问题
May 05 Python
python实现可以断点续传和并发的ftp程序
Sep 13 Python
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
Apr 17 Python
基于Django contrib Comments 评论模块(详解)
Dec 08 Python
Python中循环后使用list.append()数据被覆盖问题的解决
Jul 01 Python
ubuntu 16.04下python版本切换的方法
Jun 14 Python
pygame用blit()实现动画效果的示例代码
May 28 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
Jun 23 Python
用python写PDF转换器的实现
Oct 29 Python
python定时截屏实现
Nov 02 Python
解决Pycharm 运行后没有输出的问题
Feb 05 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 smarty truncate UTF8乱码问题解决办法
2014/06/13 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
php连接mysql数据库最简单的实现方法
2019/09/24 PHP
Laravel第三方包报class not found的解决方法
2019/10/13 PHP
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
input的focus方法使用
2010/03/13 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
2013/12/09 Javascript
浅析jQuery1.8的几个小变化
2013/12/10 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
Egret引擎开发指南之运行项目
2014/09/03 Javascript
理解AngularJs指令
2015/12/10 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
2016/06/25 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
2016/06/26 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
前端 Vue.js 和 MVVM 详细介绍
2016/12/29 Javascript
vue中mint-ui环境搭建详细介绍
2017/04/06 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
AngularJS路由删除#符号解决的办法
2017/09/28 Javascript
使用JavaScript生成罗马字符的实例代码
2018/06/08 Javascript
详解小程序开发经验:多页面数据同步
2019/05/18 Javascript
jquery.pager.js分页实现详解
2019/07/29 jQuery
微信小程序实现日历小功能
2020/11/18 Javascript
讲解python参数和作用域的使用
2013/11/01 Python
浅析python中SQLAlchemy排序的一个坑
2017/02/24 Python
在Django下创建项目以及设置settings.py教程
2019/12/03 Python
Anaconda的安装及其环境变量的配置详解
2020/04/22 Python
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
2017/02/13 HTML / CSS
微软瑞士官方网站:Microsoft瑞士
2018/04/20 全球购物
Cotton On南非:澳洲时尚平价品牌
2018/06/28 全球购物
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
安全生产检讨书
2014/01/21 职场文书
党支部公开承诺践诺书
2014/03/28 职场文书
岗位聘任协议书
2015/09/21 职场文书
小公司融资,商业计划书的8切记
2019/07/15 职场文书
python 命令行传参方法总结
2021/05/25 Python