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 24 Python
Python连接mysql数据库的正确姿势
Feb 03 Python
详解python之多进程和进程池(Processing库)
Jun 09 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
May 25 Python
Python多进程入门、分布式进程数据共享实例详解
Jun 03 Python
python读写csv文件方法详细总结
Jul 05 Python
python爬虫的一个常见简单js反爬详解
Jul 09 Python
Python学习笔记之lambda表达式用法详解
Aug 08 Python
在Tensorflow中查看权重的实现
Jan 24 Python
浅谈pymysql查询语句中带有in时传递参数的问题
Jun 05 Python
Python错误的处理方法
Jun 23 Python
python3爬虫中多线程进行解锁操作实例
Nov 25 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
生成sessionid和随机密码的例子
2006/10/09 PHP
PHP实现搜索相似图片
2015/09/22 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
10个新的最有前途的JavaScript框架
2009/03/12 Javascript
JS面向对象编程浅析
2011/08/28 Javascript
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
js+html+css实现鼠标移动div实例
2013/01/30 Javascript
javascript 函数声明与函数表达式的区别介绍
2013/10/05 Javascript
js字符串转成JSON
2013/11/07 Javascript
jquery根据name属性查找的小例子
2013/11/21 Javascript
javascript实现的HashMap类代码
2014/06/27 Javascript
一步步教大家编写酷炫的导航栏js+css实现
2016/03/14 Javascript
详解JavaScript中this关键字的用法
2016/05/26 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
2017/07/17 jQuery
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
React diff算法的实现示例
2018/04/20 Javascript
JavaScript 2018 中即将迎来的新功能
2018/09/21 Javascript
从Node.js事件触发器到Vue自定义事件的深入讲解
2020/06/26 Javascript
[47:35]VP vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
对python Tkinter Text的用法详解
2018/10/11 Python
Python如何实现动态数组
2019/11/02 Python
详解Django配置优化方法
2019/11/18 Python
Python安装whl文件过程图解
2020/02/18 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
2020/04/08 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
Python Selenium实现无可视化界面过程解析
2020/08/25 Python
AMAVII眼镜官网:时尚和设计师太阳镜
2019/05/05 全球购物
美国精品地毯网站:Boutique Rugs
2020/03/04 全球购物
社区庆中秋节活动方案
2014/02/07 职场文书
小学生读书活动总结
2014/06/30 职场文书
员工生日活动方案
2014/08/24 职场文书
致运动员的广播稿
2015/08/19 职场文书
《穷人》教学反思
2016/02/19 职场文书
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python