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直接是完成的结果
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,一次性返回给上层函数:
https://img2024.cnblogs.com/blog/1630298/202404/1630298-20240413162524949-875935201.png
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并不是直接返回,执行下边这句后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()实行结果如下,可以看到上下层函数是交替进行的,即上层函数请求迭代一个值下层函数才生成一个值并立即返回这个值:
https://img2024.cnblogs.com/blog/1630298/202404/1630298-20240413162524747-1714190357.png
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并不是直接返回,执行下边这句后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()https://img2024.cnblogs.com/blog/1630298/202404/1630298-20240413162524929-1969560744.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]