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计算圆周长、面积、球体体积并画出圆
Apr 08 Python
使用python编写脚本获取手机当前应用apk的信息
Jul 21 Python
Python3学习urllib的使用方法示例
Nov 29 Python
Python使用matplotlib填充图形指定区域代码示例
Jan 16 Python
vue.js实现输入框输入值内容实时响应变化示例
Jul 07 Python
python3.7.0的安装步骤
Aug 27 Python
Python 从一个文件中调用另一个文件的类方法
Jan 10 Python
判断python对象是否可调用的三种方式及其区别详解
Jan 31 Python
ZABBIX3.2使用python脚本实现监控报表的方法
Jul 02 Python
Django之创建引擎索引报错及解决详解
Jul 17 Python
Python 导入文件过程图解
Oct 15 Python
Numpy实现卷积神经网络(CNN)的示例
Oct 09 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
AM/FM收音机的安装与调试
2021/03/02 无线电
根德YB400的电路分析
2021/03/02 无线电
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
php输出含有“#”字符串的方法
2017/01/18 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
2019/06/05 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
基于JQuery的cookie插件
2010/04/07 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
Ajax请求在数据量大的时候出现超时的解决方法
2014/02/27 Javascript
JS使用post提交的两种方式
2015/12/03 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
2017/10/18 Javascript
chosen实现省市区三级联动
2018/08/16 Javascript
Vue-router的使用和出现空白页,路由对象属性详解
2018/09/03 Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
2018/09/11 Javascript
vue中使用微信公众号js-sdk踩坑记录
2019/03/29 Javascript
基于node+vue实现简单的WebSocket聊天功能
2020/02/01 Javascript
javascript实现固定侧边栏
2021/02/09 Javascript
Python实现测试磁盘性能的方法
2015/03/12 Python
ubuntu系统下 python链接mysql数据库的方法
2017/01/09 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
2018/05/25 Python
pip安装时ReadTimeoutError的解决方法
2018/06/12 Python
解决pycharm最左侧Tool Buttons显示不全的问题
2019/12/17 Python
如何利用python读取micaps文件详解
2020/10/18 Python
中软国际Java程序员笔试题
2014/07/19 面试题
办公室驾驶员岗位职责
2013/11/15 职场文书
自主招生教师推荐信
2014/05/10 职场文书
商业项目策划方案
2014/06/05 职场文书
2014年人力资源工作总结
2014/11/19 职场文书
新年寄语2016
2015/08/17 职场文书
小学四年级作文之最感动的一件事
2019/11/01 职场文书
关于redisson缓存序列化几枚大坑说明
2021/08/04 Redis
使用Ajax实现无刷新上传文件
2022/04/12 Javascript