Python3基础教程:return和yield的区别

一、说明

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版本

示例代码如下:

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''

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

执行结果如下。您可以看到,上级函数和下级函数是交替执行的,即上级函数在下级函数生成值之前请求迭代某个值,并立即返回此值:

[En]

The execution result is as follows. You can see that the upper-level and lower-level functions are carried out alternately, that is, the upper-level function requests to iterate over a value before the lower-level function generates a value and immediately returns this value:

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的区别

Original: https://www.cnblogs.com/python1111/p/16348590.html
Author: 小小程序员ol
Title: Python3基础教程:return和yield的区别

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/499445/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • pytest框架简单介绍

    pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点: 简单灵活,容易上手,文档丰富; 支持参数化,可以细粒度地控制要测试的测试用例; 能够支持简单的单元测…

    Python 2023年9月12日
    043
  • 机器学习实战-SVM模型实现人脸识别

    文章目录 SVM建模进行人脸识别案例 * 1、导包 2、加载数据集 3、直接使用SVM模型建模 4、数据可视化 5、网络搜索优化确定最佳性能 6、使用最佳性能SVM建模 7、优化后…

    Python 2023年10月10日
    056
  • 哈工大2022机器学习实验一:曲线拟合

    这个实验的要求写的还是挺清楚的(与上学期相比),本博客采用python实现,科学计算库采用 numpy,作图采用 matplotlib.pyplot,为了简便在文件开头import…

    Python 2023年8月2日
    054
  • pytest之.pytest_cache文件夹作用【Pytest中的cache缓存功能】

    pytest 运行完用例之后会生成一个 .pytest_cache 的缓存文件夹,用于记录用例的ids和上一次失败的用例。 1、跑自动化时经常会出现这样一个情况,一轮自动化跑完后零…

    Python 2023年9月9日
    058
  • 文件太乱了?不要慌,教你用Python全自动整理

    文件太乱了?不要慌,教你用Python全自动整理到对应分类中~ 主要知识点 文件读写 基础语法 字符串处理 循环遍历 素材 让我们先看看我那些乱七八糟的文件。 [En] Let&#…

    Python 2023年5月23日
    090
  • django如何构建一个api

    前端通过ajax向后端的url请求数据,那么当我们访问一个后端的url的时候,需要返回一些数据,这一篇笔记就是记录,访问后端url的时候,如何返回数据。 进入到我们之前的设置好的a…

    Python 2023年8月4日
    041
  • 游戏开发引擎(Pygame)核心方法

    Pygame是Python最经典的2D游戏开发第三方库,机巧围棋基于Pygame游戏开发引擎实现围棋游戏运行和交互逻辑,并搭建围棋游戏可视化界面。 本文不是Pygame的API文档…

    Python 2023年9月20日
    060
  • JUC包(java.util.concurrent)下的常用子类

    文章目录 前言 一、对象锁juc.locks包 二、原子类 三、四个常用工具类 * 3.1 信号量 Semaphore 3.2 CountDownLatch 总结 前言 博主个人社…

    Python 2023年9月27日
    056
  • python影评_用Python分析18万条《八佰》影评,看看观众怎么说?

    大家好,我是J哥。 最近《八佰》这部电影比较火,上映仅15天就已斩获22亿票房。对于沉寂了半年、影院上座率仍限定在50%的电影市场而言,这样的成绩出人意料。 从猫眼电影官网可以看到…

    Python 2023年8月19日
    056
  • MasaFramework — 缓存入门与设计

    概念 什么是缓存,在项目中,为了提高数据的读取速度,我们会对不经常变更但访问频繁的数据做缓存处理,我们常用的缓存有: 本地缓存 内存缓存:IMemoryCache 分布式缓存 Re…

    Python 2023年10月18日
    047
  • 【无标题】

    安全基础面试题 **1.自我介绍2.介绍自己常用的python库(★)fuzzywuzzy ,字符串模糊匹配。esmre ,正则表达式的加速器。pyyaml ,Python版本的Y…

    Python 2023年8月14日
    045
  • ES6 箭头函数 Arrow Function

    前言1. ES6 前定义函数2. ES6 箭头函数语法3. ES6 箭头函数返回值4. 箭头函数中的 this 到底是谁 ? 前言 ES6 新增了一种新的函数: 箭头函数 Arro…

    Python 2023年9月28日
    039
  • pandas第一天

    下面我们介绍 Series 的常用属性和方法。 在下表列出了 Series 对象的常用属性。 名称 属性 1.axes 以列表的形式返回所有行索引标签。 2.dtype 返回对象的…

    Python 2023年8月18日
    042
  • XSS漏洞讲解与多篇实战讲解

    跨站脚本攻击 XSS攻击基础 概述 个人对XSS攻击的原理认知: 原理:对可以控制传参的位置,比如url链接中,输入框中,首先闭合输出参数位置前后网页标签,在闭合的中间加上Java…

    Python 2023年8月15日
    061
  • pytest测试框架之allure报告及pamametrize数据驱动

    bin config lib plugins logo定制 allure.yaml增加插件 plugins: … -custom-logo-plugin plugins…

    Python 2023年9月14日
    041
  • python –xarray绘图

    文章目录 * – 基础绘图:.plot() – 进阶绘图–axes 首先导入数据以及相关库: import xarray as xr impor…

    Python 2023年9月1日
    061
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球