跳到主要内容

返回值、解包与多结果设计

“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

returnyield 不一样

如果函数是一次性给结果,用 return

如果函数想逐个产出结果,用生成器和 yield

def countdown(n):
while n > 0:
yield n
n -= 1

我自己的判断标准

  • 两三个结果、含义明显:元组
  • 字段多、含义要清楚:字典或数据类
  • 希望逐步产出:生成器

关联阅读