上一篇
Python中return与yield的区别 | 详细教程与示例
- Python
- 2025-08-17
- 1567
Python中return
与yield
的区别
深入理解Python函数返回机制与生成器原理
核心概念解析
在Python中,return
和yield
都用于从函数中返回值,但它们在行为和用途上有着根本的不同:
return 关键字
用于普通函数中:
- 终止函数执行
- 返回单个值
- 每次调用重新开始执行
- 函数状态不被保留
yield 关键字
用于生成器函数中:
- 暂停函数执行
- 返回一个值并记住状态
- 下次调用从暂停处继续
- 创建迭代器对象
详细对比
特性 | return | yield |
---|---|---|
函数类型 | 普通函数 | 生成器函数 |
执行过程 | 执行到return语句后终止 | 执行到yield暂停,下次继续 |
返回值 | 单个值 | 多个值(迭代生成) |
内存使用 | 立即返回所有结果 | 按需生成,节省内存 |
状态保存 | 不保存函数状态 | 保存函数状态(局部变量等) |
使用场景 | 常规函数返回值 | 大型数据集、无限序列、流处理 |
代码示例
使用return的普通函数
def square_numbers(nums):
result = []
for num in nums:
result.append(num * num)
return result # 返回完整列表
# 调用函数
numbers = [1, 2, 3, 4, 5]
squares = square_numbers(numbers)
print(squares) # 输出: [1, 4, 9, 16, 25]
执行流程: square_numbers()函数立即处理整个列表并返回结果列表
使用yield的生成器函数
def square_numbers_gen(nums):
for num in nums:
yield num * num # 每次产生一个结果
# 调用生成器函数
numbers = [1, 2, 3, 4, 5]
squares_gen = square_numbers_gen(numbers)
# 逐个获取值
print(next(squares_gen)) # 输出: 1
print(next(squares_gen)) # 输出: 4
# 或使用循环
for sq in squares_gen:
print(sq) # 输出: 9, 16, 25
执行流程: square_numbers_gen()函数每次调用next()时处理一个元素,并在yield处暂停
内存使用对比
import sys
# 生成1到1,000,000的平方 - return版本
def squares_list(n):
result = []
for i in range(1, n+1):
result.append(i * i)
return result
# 生成1到1,000,000的平方 - yield版本
def squares_generator(n):
for i in range(1, n+1):
yield i * i
# 比较内存使用
n = 1000000
list_result = squares_list(n)
gen_result = squares_generator(n)
print("列表占用内存:", sys.getsizeof(list_result), "字节")
print("生成器占用内存:", sys.getsizeof(gen_result), "字节")
输出示例:
列表占用内存: 8448728 字节 (约8.4MB)
生成器占用内存: 112 字节
生成器在内存效率方面具有巨大优势,尤其适用于大型数据集。
使用场景指南
何时使用return
- 需要立即获取所有结果
- 数据集较小,不会造成内存问题
- 函数只需执行一次,无需保持状态
- 需要返回单个计算结果
何时使用yield
- 处理大型或无限数据集
- 需要惰性求值(按需计算)
- 数据流处理(如文件读取、网络请求)
- 需要保留函数状态进行多次调用
- 实现自定义迭代器
关键区别总结
return是函数结束执行的标志,返回最终结果并释放所有资源。
yield将函数转换为生成器,暂停执行并保留状态,允许后续继续执行。
选择依据:当需要处理大量数据或实现惰性计算时使用yield,常规函数返回使用return。
本文由LaiGui于2025-08-17发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://liuhe.jltcw.com/20258349.html
发表评论