python 如何区分return和yield

 更新时间:2020年09月22日 12:05:20   作者:诸子流  
这篇文章主要介绍了python 如何区分return和yield,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下

一、说明

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,一次性返回给上层函数:

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()

执行结果如下,可以看到上下层函数是交替进行的,即上层函数请求迭代一个值下层函数才生成一个值并立即返回这个值:

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中矩阵合并、拼接、组合的实现示例

    python中矩阵合并、拼接、组合的实现示例

    本文主要介绍了python中矩阵合并、拼接、组合的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 简单谈谈Python中的闭包

    简单谈谈Python中的闭包

    一般来说闭包这个概念在很多语言中都有涉及,简单说,闭包就是根据不同的配置信息得到不同的结果,下面我们来专门讲下在Python中的闭包
    2016-11-11
  • Python中关于函数的具体用法范例以及介绍

    Python中关于函数的具体用法范例以及介绍

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数
    2021-09-09
  • python 如何用urllib与服务端交互(发送和接收数据)

    python 如何用urllib与服务端交互(发送和接收数据)

    这篇文章主要介绍了python 如何用urllib与服务端交互(发送和接收数据),帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-03-03
  • Centos 升级到python3后pip 无法使用的解决方法

    Centos 升级到python3后pip 无法使用的解决方法

    今天小编就为大家分享一篇Centos 升级到python3后pip 无法使用的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • python实现处理Excel表格超详细系列

    python实现处理Excel表格超详细系列

    这篇文章主要介绍了python实现处理Excel表格超详细系列,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • 什么是python类属性

    什么是python类属性

    在本篇文章里小编给大家分享了关于python类属性的相关知识点,需要的朋友们可以参考学习下。
    2020-06-06
  • Django基础三之视图函数的使用方法

    Django基础三之视图函数的使用方法

    这篇文章主要介绍了Django基础三之视图函数的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Selenium的使用详解

    Selenium的使用详解

    今天小编就为大家分享一篇关于Selenium的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • Python实现双进程防止单点故障实例深度探究

    Python实现双进程防止单点故障实例深度探究

    在分布式系统中,确保系统的高可用性是至关重要的,本文将深入探讨如何使用Python实现双进程自我保护机制,以应对单点故障,确保系统稳定运行,将通过详实的示例代码,介绍双进程自我保护的原理、实现步骤以及可能遇到的挑战
    2024-01-01

最新评论