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中使用dict和set方法的教程
Apr 27 Python
python中reduce()函数的使用方法示例
Sep 29 Python
python+mongodb数据抓取详细介绍
Oct 25 Python
Python3安装Scrapy的方法步骤
Nov 23 Python
Python三种遍历文件目录的方法实例代码
Jan 19 Python
详解Django-channels 实现WebSocket实例
Aug 22 Python
Python 处理文件的几种方式
Aug 23 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
Nov 11 Python
简单介绍django提供的加密算法
Dec 18 Python
基于python 凸包问题的解决
Apr 16 Python
五种Python转义表示法
Nov 27 Python
细说NumPy数组的四种乘法的使用
Dec 18 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 日漫
simplehtmldom Doc api帮助文档
2012/03/26 PHP
php 删除一维数组中某一个值元素的操作方法
2018/02/01 PHP
解决laravel资源加载路径设置的问题
2019/10/14 PHP
js form action动态修改方法
2008/11/04 Javascript
jquery属性过滤选择器使用示例
2013/06/18 Javascript
读取input:file的路径并显示本地图片的方法
2013/09/23 Javascript
js关于精确计算和数值格式化以及直接引js文件
2014/01/28 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
2015/10/08 Javascript
jQuery布局组件EasyUI Layout使用方法详解
2017/02/28 Javascript
Vue2.0实现购物车功能
2017/06/05 Javascript
详解VueJS 数据驱动和依赖追踪分析
2017/07/26 Javascript
angular或者js怎么确定选中ul中的哪几个li
2017/08/16 Javascript
Parcel 打包示例(React HelloWorld)
2018/01/16 Javascript
使用Vue写一个datepicker的示例
2018/01/27 Javascript
浅谈webpack SplitChunksPlugin实用指南
2018/09/17 Javascript
微信小程序页面间传值与页面取值操作实例分析
2019/04/30 Javascript
layui点击数据表格添加或删除一行的例子
2019/09/12 Javascript
探索Python3.4中新引入的asyncio模块
2015/04/08 Python
Python开发之快速搭建自动回复微信公众号功能
2016/04/22 Python
Python实现自动上京东抢手机
2018/02/06 Python
python如何将图片转换为字符图片
2020/08/19 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
python模拟预测一下新型冠状病毒肺炎的数据
2020/02/01 Python
Rockport乐步美国官网:风靡美国的白宫鞋
2016/11/24 全球购物
DC Shoes官网:美国滑板鞋和服饰品牌
2017/09/03 全球购物
RIP版本1跟版本2的区别
2013/12/30 面试题
仓库主管岗位职责
2014/03/02 职场文书
企业员工集体活动方案
2014/08/17 职场文书
国防教育标语
2014/10/08 职场文书
2014房屋登记授权委托书
2014/10/13 职场文书
致接力运动员加油稿
2015/07/21 职场文书
初中数学教学反思范文
2016/02/17 职场文书
Windows Server 2019 安装DHCP服务及相关配置
2022/04/28 Servers
国际最新研究在陨石中发现DNA主要成分 或由陨石带来地球
2022/04/29 数码科技