温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Python3中return和yield的区别是什么

发布时间:2022-06-08 09:30:33 来源:亿速云 阅读:129 作者:zzz 栏目:开发技术

这篇文章主要讲解了“Python3中return和yield的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python3中return和yield的区别是什么”吧!

    一、前言

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

    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的区别是什么

    感谢各位的阅读,以上就是“Python3中return和yield的区别是什么”的内容了,经过本文的学习后,相信大家对Python3中return和yield的区别是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI