yield
和 return
是 Python 中的两个关键字,主要用于从函数中返回值。它们的主要区别在于它们的工作方式和应用场景。
1. return
- 一次性返回值:当函数执行到
return
时,会立即返回值并退出函数。此时,函数的执行就结束了,所有局部变量都被销毁。 - 应用场景:适用于希望立即返回一个结果并结束函数的情况。
2. yield
- 逐步生成值:
yield
则是用于生成器函数,它不会立即结束函数,而是会暂停函数的执行,并返回一个值。当你再次调用生成器时,函数会从上次暂停的地方继续执行。 - 应用场景:适用于逐步生成大量数据,或者希望函数可以在多个调用之间保持状态的情况。特别适合处理大数据集,节省内存。
举例说明 return
和 yield
的区别:
1. 使用 return
的例子:
def simple_return():
return [1, 2, 3]
result = simple_return()
print(result)
解释:
- 函数
simple_return()
在执行时,会一次性返回[1, 2, 3]
列表,然后函数结束。 - 输出结果为:
[1, 2, 3]
2. 使用 yield
的例子:
解释:
- 函数
simple_yield()
是一个生成器函数,每次遇到yield
时,函数会暂停并返回一个值。 - 在每次循环中,
yield
会返回下一个值,函数不会结束,直到最后一个yield
完成。 - 输出结果为:
1 2 3
关键区别:
-
返回的方式不同:
return
会一次性返回所有结果,函数执行完毕,无法继续从上次停止的地方重新执行。yield
会逐步生成结果,每次返回一个值,函数暂停,等待下一次调用时继续执行。
-
内存效率:
return
一次性将整个数据返回,适用于小数据集。yield
在每次调用时生成一个值,适合处理大数据集,可以节省内存,因为不会一次性加载整个数据集。
使用场景的对比:
return
的应用场景:
- 如果你有一个小型数据集,并且需要一次性处理,使用
return
更加合适。
def get_numbers():
return [i for i in range(1000)]
numbers = get_numbers() # 一次性返回 1000 个数
yield
的应用场景:
- 如果你有一个非常大的数据集,并且不想一次性将它们加载到内存中,
yield
是更好的选择。
def get_numbers():
for i in range(1000):
yield i numbers = get_numbers() # 返回一个生成器,每次访问生成一个数
for num in numbers:
print(num)
在 yield
的例子中,程序会逐步生成数值,并不会一次性占用大量内存。这对于大规模数据的处理非常有用。
其实yield语句的本质是就是把原函数暂停在那个位置输出结果,等到下次再次调用的时候再次从那个位置开始执行。