首页 > 编程语言 >Python教程:return和yield的区别

Python教程:return和yield的区别

时间:2024-04-13 16:34:22浏览次数:27  
标签:return iterator Python list yield result gen

return一直中,每中语言中其没没有很大差别,就不多说了。(shell语言return的是退出状态,可能差别是比较大的)

最早看到yield应该是哪们语言用来调整什么线程优先级的,记不清了,不过那里的yield和python中的yield应该功能有区别。

一、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,一次性返回给上层函数:
在这里插入图片描述
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 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):
	    #学习中遇到问题没人解答?小编创建了一个Python学习交流群:153708845
        # 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()

在这里插入图片描述

标签:return,iterator,Python,list,yield,result,gen
From: https://www.cnblogs.com/xxpythonxx/p/18133029

相关文章

  • Python中paramiko 模块的用法
    paramiko是一个用Python语言编写的、遵循SSH2协议、支持以加密和认证方式进行连接远程服务器的模块。改模块可以对远程服务器进行一些命令或文件操作。1.安装使用pip3安装paramiko模块pip3installparamiko连接远程服务器paramiko模块连接远程服务器可以使用远程......
  • centos6.5安装python3.6.9
    下载python:https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz安装tar-zxvfPython-3.6.9.tgzcdPython-3.6.9./configure--prefix=/opt/python3.6makemakeinstallecho"/opt/python3.6/lib">/etc/ld.so.conf.d/python3.6.9.confsudoldconf......
  • Visual Studio Code & Python教程3顶级扩展
    3简介扩展功能非常宝贵。它们有助于提高代码质量,加快开发工作。我们将介绍一些必备的通用扩展。3.1顶级扩展3.1.1Pylance微软的Pylance可以大大提高你的工作效率。Pylance是一款Python语言服务器,它增强了IntelliSense、语法高亮和大量其他功能,为Python开发人员带来了令人......
  • python调用库生成自然语言语音包
    当前还没release版本,只能git安装pipinstallgit+https://github.com/huggingface/parler-tts.git代码fromparler_ttsimportParlerTTSForConditionalGenerationfromtransformersimportAutoTokenizerimportsoundfileassfimporttorchdevice="cuda:0"iftor......
  • Python函数
    函数定义和调用defadd(x,y):#先定义ans=x+yreturnans#返回ansadd(4,5)#后调用注:定义函数时的“x和y”为形式参数,调用函数时的“4和5”为实际参数,当调用函数时,将实际参数“4和5”传递给形式参数“x和y”。None类型defsay_hello():#定义......
  • Python3 YOLOv8 体验
    参考https://docs.ultralytics.com/zh/quickstart/#use-ultralytics-with-pythonhttps://pytorch.org/get-started/locally/https://www.zhihu.com/question/275575243https://github.com/onnx/onnx/issues/5773https://stackoverflow.com/questions/72352528/how-to-fix-......
  • Python根据主播直播时间段判定订单销售额归属
    写在前面:最近在群里看到一个这样的直播电商的场景觉得还是挺有趣的,于是就想用Python来实现。需求描述:根据主播直播时间段结合销售订单的付款时间判断所属销售的归属生成主播在线直播时间段数据fromdatetimeimportdatetime,timedeltaimportrandomimportpandasaspd......
  • /usr/bin/env: "python": 没有那个文件或目录
    我电脑里面是Python3的解释器,不是Python的解释器,因此作如下操作1.首先查看Python3解释器的路径1whichpython3 2.我们将创建一个指向/usr/bin/python3的软链接,名为python。1sudoln-s/usr/bin/python3/usr/bin/pythonPythonUbuntu/usr/bin/env:python:没有那......
  • Python量化交易系统实战--计算交易指标
     作者:麦克煎蛋  出处:https://www.cnblogs.com/mazhiyong/转载请保留这段声明,谢谢! 本节主要包括以下内容:1、计算涨跌幅使用shift函数计算涨跌幅defcalculate_change_pct(data):"""涨跌幅=(当期收盘价-前期收盘价)/前期收盘价:paramdata:datafram......
  • HX711压力传感器+树莓派python驱动程序
    #-*-coding:utf-8-*-importRPi.GPIOasGPIOimporttime#VCC接1号针脚,GND接6号针脚,SCK接11号针脚,DT接13号针脚classHx711():defsetup(self):self.SCK=11#物理引脚第11号,时钟self.DT=13#物理引脚第13号,数据self.flag=1......