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 socket C/S结构的聊天室应用实现
Nov 30 Python
python实现的简单窗口倒计时界面实例
May 05 Python
详解字典树Trie结构及其Python代码实现
Jun 03 Python
tensorflow中next_batch的具体使用
Feb 02 Python
Python numpy 点数组去重的实例
Apr 18 Python
Python嵌套列表转一维的方法(压平嵌套列表)
Jul 03 Python
python对于requests的封装方法详解
Jan 03 Python
python环境路径配置以及命令行运行脚本
Apr 02 Python
Python实现一个数组除以一个数的例子
Jul 20 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
Jan 18 Python
使用python实现名片管理系统
Jun 18 Python
python神经网络 使用Keras构建RNN训练
May 04 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
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
PHP 循环列出目录内容的函数代码
2010/05/26 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
2014/04/25 PHP
CI框架中通过hook的方式实现简单的权限控制
2015/01/07 PHP
jquery中常用的SET和GET
2009/01/13 Javascript
jquery.validate使用攻略 第三部
2010/07/01 Javascript
js如何设置在iframe框架中指定div不显示
2013/12/04 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
2014/01/02 Javascript
javascript跨浏览器的属性判断方法
2014/03/16 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
JavaScript简单下拉菜单实例代码
2015/09/07 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
2020/04/20 Javascript
JQuery和PHP结合实现动态进度条上传显示
2016/11/23 Javascript
vue 中自定义指令改变data中的值
2017/06/02 Javascript
JS实现div模块的截图并下载功能
2017/10/17 Javascript
解决vue中虚拟dom,无法实时更新的问题
2018/09/15 Javascript
js replace替换字符串同时替换多个方法
2018/11/27 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
vue-cli3单页构建大型项目方案
2020/04/07 Javascript
解决vuex数据页面刷新后初始化操作
2020/07/26 Javascript
Python简单计算数组元素平均值的方法示例
2017/12/26 Python
python使用TensorFlow进行图像处理的方法
2018/02/28 Python
python在每个字符后添加空格的实例
2018/05/07 Python
解决python selenium3启动不了firefox的问题
2018/10/13 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
2018/12/15 Python
python分布式计算dispy的使用详解
2019/12/22 Python
用Python制作音乐海报
2021/01/26 Python
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
大学生写自荐信的技巧
2014/01/08 职场文书
茶叶生产计划书
2014/01/10 职场文书
反邪教标语
2014/06/23 职场文书
新闻人物通讯稿
2014/10/09 职场文书
2016年教师党员公开承诺书
2016/03/24 职场文书
使用refresh_token实现无感刷新页面
2022/04/26 Javascript