Python教程:return和yield的区别

这篇具有很好参考价值的文章主要介绍了Python教程: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,一次性返回给上层函数:
Python教程: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()

执行结果如下,可以看到上下层函数是交替进行的,即上层函数请求迭代一个值下层函数才生成一个值并立即返回这个值:
Python教程: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):
	    #学习中遇到问题没人解答?小编创建了一个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()

Python教程:return和yield的区别文章来源地址https://www.toymoban.com/news/detail-850187.html

到了这里,关于Python教程:return和yield的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • response的Content-Length设置错误,导致springboot文件下载,代码已经return,postman一直等待到超时

    最近在工作中遇到了文件下载的需求, 期初以为也很简单, DownloadController 启动后访问,localhost:8080/download 请求处理完后,postman 一直在等待, response的head儿中设置了content-length,导致写出的数据不相等时, postman 便一直等待,直至超时, 已写出的数据就是byte字节数组,后台

    2024年01月17日
    浏览(44)
  • python的多线程和yield

    拉取、入库的优化点: 请求接口: 场景:原来一次请求一个月的数据,可能会面临接口卡顿的问题,而且数据量过大,有时候会溢出 解决:可以考虑由 一次请求 切分为 小而多次请求 加个for循环,分为小批量去请求,避免接口数据量过大 将多次请求采用 多线程 进行,避免

    2023年04月08日
    浏览(27)
  • python使用迭代生成器yield减少内存占用的方法

    在python编码中for循环处理任务时,会将所有的待遍历参量加载到内存中。 其实这本没有必要,因为这些参量很有可能是一次性使用的,甚至很多场景下这些参量是不需要同时存储在内存中的,这时候就会用到本文所介绍的迭代生成器yield。 首先我们用一个例子来演示一下迭代

    2024年04月28日
    浏览(23)
  • 【switch...case】击穿 | return和break的区别

    首先计算switch后面圆括号中表达式的值,然后用此值依次与各个case的常量表达式比较,若圆括号中表达式的值与某个case后面的常量表达式的值相等,就执行此case后面的语句,执行后遇break语句就退出switch语句;若圆括号中表达式的值与所有case后面的常量表达式都不等,则执行defaul

    2024年02月08日
    浏览(25)
  • 在python中实现使用迭代生成器yield减少内存占用的方法

    在python编码中for循环处理任务时,会将所有的待遍历参量加载到内存中。其实这本没有必要,因为这些参量很有可能是一次性使用的,甚至很多场景下这些参量是不需要同时存储在内存中的,这时候就会用到本文所介绍的迭代生成器yield。 首先我们用一个例子来演示一下迭代

    2024年02月11日
    浏览(28)
  • Python 函数:理解并使用 return 语句

    你好,我是悦创。 函数在 Python 编程中起着至关重要的作用。他们封装了一段代码,并给它一个名字,这样我们可以在程序的任何地方,通过这个名字来调用这段代码。 return 是函数的一个重要组成部分,它可以使函数输出一个值。如果函数没有 return 语句,那么这个函数将没

    2024年02月10日
    浏览(25)
  • Python入门教程+项目实战-11.4节: 元组与列表的区别

    目录 11.4.1 不可变数据类型 11.4.2 可变数据类型 11.4.3 元组与列表的区别 11.4.4 知识要点 11.4.5 系统学习python 不可变数据类型是指不可以对该数据类型进行修改,即只读的数据类型。迄今为止学过的不可变数据类型有字符串,元组。 在使用[]操作符对字符串,元组进行修改时

    2024年02月01日
    浏览(45)
  • C#的yield

    在 C# 中, yield 用于定义迭代器方法(Iterator Methods),并使其返回一个可枚举的序列。通过使用 yield ,可以简化迭代器的实现,使其更加直观和易于理解。 使用 yield 定义的方法被称为迭代器方法,它返回一个实现了 IEnumerable 或 IEnumerableT 接口的序列。在

    2024年02月14日
    浏览(22)
  • 解读 --- yield 关键字

    yield 是 C# 中的一种语言特性,用于在枚举器中简化迭代器的实现。它使得开发人员可以通过定义自己的迭代器来简化代码,而不必手动实现 IEnumerable 和 IEnumerator 接口。 使用 yield ,可以将迭代器中的值一次一个地返回,而不必使用一个集合对象存储所有的值。

    2024年02月16日
    浏览(23)
  • 划线验证码一直出错?最新浏览器获取京东cookie教程

    由于JD项目的滥用导致的京东滑块验证码以及划线验证码一直出现验证失败 1.打开手机京东app 2.进入 “我的” 页面 3.点击右上方的设置按钮 4.进入“账户与安全” 5.修改密码(自己记得住的) 1.打开浏览器开发者模式(F12)打开 m.jd.com 2.在登陆时选择“使用密码登录” 3.使用

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包