Python3中return和yield的区别是什么
导读:本文共2228.5字符,通常情况下阅读需要7分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 一、前言return一直中,每中语言中其没没有很大差别,就不多说了。(shell语言return的是退出状态,可能差别是比较大的)最早看到yield应该是哪们语言用来调整什么线程优先级的,记不清了,不过那里的yield和python中的yield应该功能有区别。二、return和yield的异同共同点:return和yield都用来返回值;在一次性地返回所有值场... ...
目录
(为您整理了一些要点),点击可以直达。一、前言
return一直中,每中语言中其没没有很大差别,就不多说了。(shell语言return的是退出状态,可能差别是比较大的)最早看到yield应该是哪们语言用来调整什么线程优先级的,记不清了,不过那里的yield和python中的yield应该功能有区别。
二、return和yield的异同
共同点:return和yield都用来返回值;在一次性地返回所有值场景中return和yield的作用是一样的。
不同点:如果要返回的数据是通过for等循环生成的迭代器类型数据(如列表、元组),return只能在循环外部一次性地返回,yeild则可以在循环内部逐个元素返回。下边我们举例说明这个不同点。
三、实例说明
1 return版本
示例代码如下:
classTestYield:defgen_iterator(self):result_list=[]forjinrange(3):print(f"gen_iterator-{j}")result_list.append(j)#return在循环的外部,待变量完全生成后一次性返回returnresult_listdefcall_gen_iterator(self):#执行下边这句后result_list直接是完成的结果[0,1,2]result_list=self.gen_iterator()foriinresult_list:print(f"call_gen_iterator-{i}")if__name__=="__main__":obj=TestYield()obj.call_gen_iterator()
执行结果如下,可以看到一次性执行完下层函数,生成完整的迭代器类型返回值result_list,一次性返回给上层函数:
2 yield版本
示例代码如下:
classTestYield:defgen_iterator(self):forjinrange(3):print(f"do_something-{j}")#yield在for循环内部yieldjdefcall_gen_iterator(self):#yield并不是直接返回[0,1,2],执行下边这句后result_list什么值都没有result_list=self.gen_iterator()#i每请求一个数据,才会触发gen_iterator生成一个数据foriinresult_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嵌套使用
classTestYield:defgen_iterator(self):forjinrange(3):print(f"do_something-{j}")#yield在for循环内部yieldjdefgen_iterator_middle(self):print(f"gen_iterator_middle")#返回的是迭代器的句柄,所以加一层return不影响是可以理解的returnself.gen_iterator()defcall_gen_iterator(self):#yield并不是直接返回[0,1,2],执行下边这句后result_list什么值都没有result_list=self.gen_iterator_middle()#i每请求一个数据,才会触发gen_iterator生成一个数据foriinresult_list:print(f"call_gen_iterator-{i}")if__name__=="__main__":obj=TestYield()obj.call_gen_iterator()
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
Python3中return和yield的区别是什么的详细内容,希望对您有所帮助,信息来源于网络。