先用一个表格直接总结Python中return和yield的区别,如下:特性 | | |
函数类型 | 普通函数 | 生成器函数 |
状态 | 函数终止 | 函数状态被保存 |
内存 | 一次性返回所有值 | |
多次调用 | 需要重新调用函数 | 可以从停止处继续 |
使用场景 | 单个结果 | 流式/迭代大数据集 |
以下详述return和yield的具体使用及区别:def get_numbers(): return [1, 2, 3] # 返回一个列表 # 函数执行 return 后即结束result = get_numbers()print(result) # [1, 2, 3]
def get_numbers(): # 每次 yield 后函数会暂停,下次调用 next() 时继续执行 yield 1 yield 2 yield 3result = get_numbers() # 返回一个生成器对象print(next(result)) # 1print(next(result)) # 2print(next(result)) # 3
从内存效率的角度而言,取决于我们的使用需求。如地震数据处理时,我们的一个数据集中有很多炮数据,那么使用yield每次返回一炮数据供程序处理执行。而如果是一个很小规模的数据,那么return一次返回全体数据就能够让程序直接处理。
最后用一个小例程展示两种方式的使用并结束本文:
# 使用 return - 一次性加载所有内容到内存def squares_return(n): return [i**2 for i in range(n)] # 创建整个列表# 使用 yield - 按需生成def squares_yield(n): for i in range(n): yield i**2 # 一次只生成一个值# 使用 yield 可以处理百万级数据而不会有内存问题for square in squares_yield(1000000): # 逐个处理平方值 print(f"The current value to be processed is {square}")