Python3 中return和yield的区别

作者:小小程序员ol 时间:2023-10-19 09:03:00 

一、前言

return一直中,每中语言中其没没有很大差别,就不多说了。(shell语言return的是退出状态,可能差别是比较大的)最早看到yield应该是哪们语言用来调整什么线程优先级的,记不清了,不过那里的yield和python中的yield应该功能有区别。

python中最早看到yield应该是使用scrapy框架写爬虫的时候,之前也有去看yiled的用法,总记不太住。今天又去看了一下,基本上来就是讲些斐波那契数列的烦的要死,自己写段程序研究了一下,这里记一下。

二、return和yield的异同

共同点:return和yield都用来返回值;在一次性地返回所有值场景中return和yield的作用是一样的。

不同点:如果要返回的数据是通过for等循环生成的迭代器类型数据(如列表、元组),return只能在循环外部一次性地返回,yeild则可以在循环内部逐个元素返回。下边我们举例说明这个不同点。

三、实例说明

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

Python3 中return和yield的区别

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

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

Python3 中return和yield的区别

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

Python3 中return和yield的区别

来源:https://www.cnblogs.com/python960410445/p/16348590.html

标签:Python3,Python,return,yield
0
投稿

猜你喜欢

  • vue缓存的keepalive页面刷新数据的方法

    2023-07-02 17:01:00
  • 详解MySql存储过程参数的入门使用

    2024-01-25 23:24:06
  • pycharm 批量修改变量名称的方法

    2021-09-07 22:48:29
  • python语言使用技巧分享

    2022-10-24 09:29:38
  • 浅谈ASP自动采集程序及入库

    2007-08-17 11:25:00
  • Python图像读写方法对比

    2022-10-07 08:13:46
  • Python命令行参数定义及需要注意的地方

    2022-09-16 02:34:39
  • 基于python读取.mat文件并取出信息

    2021-10-24 12:06:26
  • javascript 读取图片文件的大小

    2024-04-17 10:40:11
  • python抓取网页中链接的静态图片

    2023-04-17 04:27:27
  • python实现AES算法及AES-CFB8加解密源码

    2022-06-14 01:24:01
  • python编写Logistic逻辑回归

    2022-03-04 16:57:03
  • php下使用iconv需要注意的问题

    2023-11-23 03:05:09
  • SpringBoot集成内存数据库Derby的实践

    2024-01-13 06:02:42
  • python基础教程之python消息摘要算法使用示例

    2023-07-03 20:06:00
  • Django实现网页分页功能

    2021-04-05 22:12:18
  • XML教程:什么是XML及XML和HTML的区别

    2008-09-05 17:21:00
  • python引入不同文件夹下的自定义模块方法

    2023-04-24 18:37:22
  • Mysql彻底解决中文乱码问题的方案(Illegal mix of collations for operation)

    2024-01-26 16:33:51
  • Python字符串三种格式化输出

    2022-12-15 09:47:59
  • asp之家 网络编程 m.aspxhome.com