• Python中return和yield的区别


    嗨喽,大家好呀~这里是爱看美女的茜茜呐

    一、说明

    python中最早看到yield应该是使用scrapy框架写爬虫的时候,之前也有去看yiled的用法,总记不太住。

    今天又去看了一下,基本上来就是讲些斐波那契数列的烦的要死,自己写段程序研究了一下,这里记一下。


    👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~

    python源码、视频教程、插件安装教程、资料我都准备好了,直接在文末名片自取就可


    二、return和yield的异同

    共同点:

    1. return和yield都用来返回值;

    2. 在一次性地返回所有值场景中return和yield的作用是一样的。

    不同点:

    如果要返回的数据是通过for等循环生成的迭代器类型数据(如列表、元组),return只能在循环外部一次性地返回,yeild则可以在循环内部逐个元素返回。

    下边我们举例说明这个不同点。

    三、实例说明

    1 return版本

    示例代码如下:

    '''
    python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过)
    即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
    '''
    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    执行结果如下,可以看到一次性执行完下层函数,生成完整的迭代器类型返回值result_list,一次性返回给上层函数:

    2 yield版本

    示例代码如下:

    '''
    python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过)
    即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
    '''
    class TestYield:
        def gen_iterator(self):
            for j in range(3):
                print(f"do_something-{j}")
                # yieldfor循环内部
                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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

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

    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}")
                # yieldfor循环内部
                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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    尾语

    感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

    希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

    躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

    最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇

  • 相关阅读:
    【工具推荐】替换typora的又一款神器
    Windows电脑如何录制电脑桌面?
    systemverilog/uvm的 blog https://www.amiq.com/consulting/blog/
    一个Kbuild工程生成多个ko文件及其在驱动单元测试上的应用
    Qt connect()方法Qt::ConnectionType
    信贷反欺诈场景中策略与模型的搭建|实操一大反欺诈模型
    月涨粉超150W,B站知识UP主是如何强势崛起?
    TS装饰器bindThis优雅实现React类组件中this绑定
    【详细学习SpringBoot自动装配原理分析之核心流程初解析-1】
    SpringSecurity学习(一)
  • 原文地址:https://blog.csdn.net/m0_72282564/article/details/134333210