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使用urllib2获取网络资源实例讲解
Dec 02 Python
跟老齐学Python之字典,你还记得吗?
Sep 20 Python
python计算书页码的统计数字问题实例
Sep 26 Python
python回调函数用法实例分析
May 09 Python
Python中的lstrip()方法使用简介
May 19 Python
python发送邮件脚本
May 22 Python
在python中使用requests 模拟浏览器发送请求数据的方法
Dec 26 Python
python交换两个变量的值方法
Jan 12 Python
Python 单例设计模式用法实例分析
Sep 23 Python
Python类反射机制使用实例解析
Dec 30 Python
python 实现任务管理清单案例
Apr 25 Python
在Python 中将类对象序列化为JSON
Apr 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
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
2007/09/24 PHP
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
2017/02/24 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
2017/06/19 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
laravel validate 设置为中文的例子(验证提示为中文)
2019/09/29 PHP
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
2008/11/03 Javascript
基于jquery的loading 加载提示效果实现代码
2011/09/01 Javascript
xml转json的js代码
2012/08/28 Javascript
Javascript的时间戳和php的时间戳转换注意事项
2013/04/12 Javascript
js实现表单检测及表单提示的方法
2015/08/14 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
jQuery formValidator表单验证
2016/01/07 Javascript
JavaScript正则表达式实例详解
2016/10/16 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
JS中双击和单击事件冲突的解决方法
2018/04/09 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
2019/12/12 Javascript
python中assert用法实例分析
2015/04/30 Python
python dict.get()和dict['key']的区别详解
2016/06/30 Python
用Python将mysql数据导出成json的方法
2018/08/21 Python
python scipy求解非线性方程的方法(fsolve/root)
2018/11/12 Python
Python 复平面绘图实例
2019/11/21 Python
python离线安装外部依赖包的实现
2020/02/13 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
Python 炫技操作之合并字典的七种方法
2020/04/10 Python
Python实现数字的格式化输出
2020/08/01 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
美国家用和厨房电器销售网站:Appliances Connection
2020/01/24 全球购物
诉前财产保全担保书
2014/05/20 职场文书
房地产端午节活动方案
2014/08/24 职场文书
办公室规章制度范本
2015/08/04 职场文书
低端且暴利的线上线下创业项目分享
2019/09/03 职场文书
python内置进制转换函数的操作
2021/06/02 Python