返回值、解包与多结果设计
“Python 可以返回多个值”这句话很常见,但更准确一点的说法是:Python 会把多个返回值打包成一个元组,再由你在调用端解包。
最基础的返回
def square(x):
return x * x
返回多个值
def min_max(values):
return min(values), max(values)
low, high = min_max([3, 1, 5, 2])
本质上等价于:
def min_max(values):
return (min(values), max(values))
解包
point = (3, 5)
x, y = point
星号解包也很常用:
first, *middle, last = [1, 2, 3, 4, 5]
什么时候返回元组
适合这些情况:
- 返回值数量少
- 返回值顺序很清楚
- 这几个值天然是一组
例如坐标、最小值和最大值、宽和高。
什么时候返回字典或数据类
如果返回值开始变多、顺序不好记、含义不够明显,就别硬用元组了。
def get_user():
return {
"name": "alice",
"score": 95,
"city": "Chengdu",
}
再进一步,可以用 dataclass:
from dataclasses import dataclass
@dataclass
class User:
name: str
score: int
city: str
return 和 yield 不一样
如果函数是一次性给结果,用 return。
如果函数想逐个产出结果,用生成器和 yield:
def countdown(n):
while n > 0:
yield n
n -= 1
我自己的判断标准
- 两三个结果、含义明显:元组
- 字段多、含义要清楚:字典或数据类
- 希望逐步产出:生成器