Python里面return和yield的异同是什么
Admin 2022-08-11 群英技术资讯 591 次浏览
return一直中,每中语言中其没没有很大差别,就不多说了。(shell语言return的是退出状态,可能差别是比较大的)最早看到yield应该是哪们语言用来调整什么线程优先级的,记不清了,不过那里的yield和python中的yield应该功能有区别。
python中最早看到yield应该是使用scrapy框架写爬虫的时候,之前也有去看yiled的用法,总记不太住。今天又去看了一下,基本上来就是讲些斐波那契数列的烦的要死,自己写段程序研究了一下,这里记一下。
共同点:return和yield都用来返回值;在一次性地返回所有值场景中return和yield的作用是一样的。
不同点:如果要返回的数据是通过for等循环生成的迭代器类型数据(如列表、元组),return只能在循环外部一次性地返回,yeild则可以在循环内部逐个元素返回。下边我们举例说明这个不同点。
示例代码如下:
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,一次性返回给上层函数:
示例代码如下:
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()
执行结果如下,可以看到上下层函数是交替进行的,即上层函数请求迭代一个值下层函数才生成一个值并立即返回这个值:
从上边两个小节可以看到,虽然return和yield两者执行的顺序有区别,但整个要做的事情是一样的,所以使用yield并不会比return快,甚至我们可以猜测由于yield总发生上下文切换在速度上还会慢一些,所以速度不是yield的意义。
他们的主要区别是yiled要迭代到哪个元素那个元素才即时地生成,而return要用一个中间变量result_list保存返回值,当result_list的长度很长且每个组成元素内容很大时将会耗费比较大的内存,此时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()
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
ord() 函数是 chr() 函数(对于 8 位的 ASCII 字符串)的配对函数,它以一个字符串(Unicode 字符)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,这篇文章主要介绍了python 中内置函数ord()返回字符串的ASCII数值,需要的朋友可以参考下
这篇文章主要介绍了pytest fixtures函数及测试函数的参数化解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
这篇文章主要介绍了完美解决matplotlib子图坐标轴重叠问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
pytorch是一个非常优秀的深度学习的框架,具有速度快,代码简洁,可读性强的优点,下面这篇文章主要给大家介绍了关于PyTorch使用GPU训练的两种方法,需要的朋友可以参考下
这篇文章主要给大家分享python的mro算法的内容,可能一些朋友对mro不是很了解,但是没关系,下文有详细的介绍,及实例代码供大家参考,对python的mro算法感兴趣的朋友接下来就跟随小编一起来学习一下吧。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008