在 Python 中,函数的返回值(Return Value)是函数调用后向调用者提供计算结果的主要机制。

一、基本概念与语法结构

1、return 语句语法结构

return 是函数结束执行并返回结果的标准语句。

return [expression]

expression:任意可求值的 Python 表达式。

若省略 expression,解释器默认返回内置对象 None。

一旦执行到 return 语句,函数立即终止,其后语句不会再执行。

返回结果可以是任意对象(数值、字符串、容器、自定义对象等)。

示例:

print(result)  # 输出:16

return 是一种控制流语句,并非信息输出命令,它的作用是结束函数执行并将结果交给调用方。

2、return 与 raise 的关系

return 和 raise 都会导致函数终止执行,但二者语义截然不同。

打开网易新闻 查看精彩图片

示例:

    print("错误:", e)

• return 表示函数的正常结束语义。

• raise 用于函数的异常结束语义。

• 在良好设计中,不应以返回错误码替代异常处理机制。

3、提前返回(Early Return)

在函数中根据条件提前返回结果,可避免深层嵌套、提升可读性。

    return a / b

“提前返回”优于深层嵌套的 if 结构,常用于输入验证、边界条件检查、默认分支等场景。

二、基础返回形式

1、返回单个值

最常见的写法,通过 return 返回单个结果。

print(calculate_bmi(70, 1.75))  # 输出:22.86

单值返回常用于数值计算、逻辑判断、字符串拼接等任务。

2、返回多个值

Python 允许使用逗号分隔多个表达式进行返回,解释器会自动将其打包为元组(tuple)。

print("商:", q, "余数:", r)  # 输出:3 2

• return expr1, expr2 等价于 return (expr1, expr2)。

• 所谓“多值返回”实为“容器返回”的语法糖。

• 可灵活配合解包(unpacking)机制使用。

3、无 return 语句

某些函数仅执行操作(如打印、写文件),它们可能并不需要返回值

若函数未显式使用 return,或不指定返回内容,解释器会在函数末尾自动执行:

return None

示例:

print(result)                # 输出:None

• 返回 None 意味着函数执行完毕但无需结果传递。

• 在接口设计中应明确函数是否具备返回值。

• 不建议依赖隐式None作为逻辑判断依据。

三、结构化与高阶返回

1、返回容器结构

当结果具有多层或多属性信息时,可返回容器类型数据(如 list、dict、set)。

# 输出:{'name': '小艾', 'age': 18, 'courses': ['english', 'math', 'physics']}

• 返回容器有助于封装多维数据。

比如,元组(tuple)常用于多个值的固定返回,列表(list)常用于动态结果集的返回,字典(dict)常用于命名字段的结构化返回,集合(set)可自动去重,等等。

• 调用者可按键或索引灵活访问。

• 容器返回可取代多重 return 分支,提高接口清晰度。

2、返回函数对象

Python 函数是一等对象(first-class object),既作为参数传递,也可作为返回值返回。

print(cube(3))    # 输出:27

• 上例中,return inner 返回的是函数对象,而非执行结果。

• 若内部函数引用外部变量(如上例中的 exponent),则形成闭包(closure)。

• 返回函数对象常用于实现装饰器、策略模式、延迟计算等动态逻辑。

3、返回类实例

函数也可返回对象实例,以便后续方法调用。

print(f"{user.name} ({user.role})")  # 输出:小艾 (guest)

返回类实例常用于封装复杂状态或行为,是工厂函数(factory function)的典型模式。

4、返回生成器对象

yield 不同于 return,它提供了一种延迟返回机制。当函数体中出现 yield,该函数被编译为生成器函数,其调用结果为生成器对象。

# 输出:[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

• yield 会暂停函数执行并返回当前值。

• 与 return 不同,生成器可持续恢复执行。每次迭代都会从上次中断处继续。

• 返回生成器对象常用于惰性求值、大数据流、协程结构。

四、返回值的类型注解与文档化

1、类型注解

Python 3.5+ 支持在函数定义中通过 -> 指定返回值类型提示(type hint)。

    return 3.1416 * radius ** 2

说明:-> float 是返回值注解。

复杂类型返回示例:

print(coordinates)  # 输出:(3.14, 5.67)

• 类型提示不影响运行时行为,仅供阅读、类型检查器或 IDE 使用。

• 对于可选返回(可能为 None),推荐使用 Optional[T]。

2、文档化返回值

在函数文档字符串(docstring)中,应清晰描述返回值的类型与语义。

    return round(price * (1 - rate), 2)

文档化返回值是高质量函数设计的重要组成部分。

五、函数返回值的设计原则

1、单一职责原则

每个函数只完成一个明确的任务。

2、保持返回类型一致

避免函数在不同路径返回不同类型。

3、优先抛出异常而非返回错误码

在复杂场景中,用 raise 代替 (False, message)。

4、结构化返回

推荐使用字典(dict)、命名元组(namedtuple)或自定义类封装复杂结果。

5、文档化与类型注解

明确类型提示与文档说明,函数行为自解释、可维护。

小结

在 Python 中,return 用于结束函数并返回计算结果。若无表达式或未显式使用 return,默认返回 None。

所谓“多值返回”实为返回一个包含多个结果的容器(如元组、字典等)。

函数还可返回函数、类实例或生成器对象,从而支持高阶与对象化设计。

结合类型注解与文档说明,可使函数行为清晰、自解释且易维护。

点赞有美意,赞赏是鼓励