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 排列组合之itertools
Mar 20 Python
python进阶教程之异常处理
Aug 30 Python
python实现堆栈与队列的方法
Jan 15 Python
Python利用递归和walk()遍历目录文件的方法示例
Jul 14 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
Oct 01 Python
python3爬取淘宝信息代码分析
Feb 10 Python
python 对txt中每行内容进行批量替换的方法
Jul 11 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
Sep 28 Python
Python模拟FTP文件服务器的操作方法
Feb 18 Python
Python基础教程之输入输出和运算符
Jul 26 Python
实操Python爬取觅知网素材图片示例
Nov 27 Python
Python实现照片卡通化
Dec 06 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执行速度全攻略(上)
2006/10/09 PHP
推荐php模板技术[转]
2007/01/04 PHP
php 智能404跳转代码,适合换域名没改变目录的网站
2010/06/04 PHP
Thinkphp使用mongodb数据库实现多条件查询方法
2014/06/26 PHP
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
js+canvas实现验证码功能
2020/09/21 Javascript
Vue + Elementui实现多标签页共存的方法
2019/06/12 Javascript
layui内置模块layim发送图片添加加载动画的方法
2019/09/23 Javascript
JS+html5实现异步上传图片显示上传文件进度条功能示例
2019/11/09 Javascript
js实现时分秒倒计时
2019/12/03 Javascript
Node.js API详解之 repl模块用法实例分析
2020/05/25 Javascript
vue二选一tab栏切换新做法实现
2021/01/19 Vue.js
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
Python中的Numpy入门教程
2014/04/26 Python
python中global与nonlocal比较
2014/11/21 Python
python 链接和操作 memcache方法
2017/03/04 Python
rabbitmq(中间消息代理)在python中的使用详解
2017/12/14 Python
Python爬虫框架scrapy实现的文件下载功能示例
2018/08/04 Python
python实现zabbix发送短信脚本
2018/09/17 Python
浅谈python 读excel数值为浮点型的问题
2018/12/25 Python
使用Python实现将list中的每一项的首字母大写
2019/06/11 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
keras小技巧——获取某一个网络层的输出方式
2020/05/23 Python
python实现最短路径的实例方法
2020/07/19 Python
佐卡伊官网:中国知名珠宝品牌
2017/02/05 全球购物
园林资料员岗位职责
2013/12/30 职场文书
新年团拜会主持词
2014/04/02 职场文书
医院信息公开实施方案
2014/05/09 职场文书
十佳家长事迹材料
2014/08/26 职场文书
教师节活动总结
2014/08/29 职场文书
2014年银行客户经理工作总结
2014/11/12 职场文书
2015高考寄语集锦
2015/02/27 职场文书
2019旅游导游工作总结
2019/06/27 职场文书
教你用Python matplotlib库制作简单的动画
2021/06/11 Python
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python
Flutter集成高德地图并添加自定义Maker的实践
2022/04/07 Java/Android