飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • 第1章 Python简介

    • Python是什么
    • 安装与运行
    • 交互式解释器
    • 注释与编码规范
  • 第2章 变量与数据类型

    • 变量与对象
    • 整数 int
    • 浮点数 float
    • 复数 complex
    • 布尔值 bool
    • 字符串 str
    • 空值 None
    • 类型转换
  • 第3章 运算符与表达式

    • 算术运算符
    • 比较运算符
    • 赋值运算符
    • 逻辑运算符
    • 位运算符
    • 身份与成员运算符
    • 海象运算符
    • 运算符优先级
  • 第4章 流程控制

    • if 语句
    • if-else 语句
    • if-elif-else 语句
    • match-case 语句
    • 条件表达式(三元运算符)
    • while 循环
    • for 循环
    • range 函数
    • break 与 continue
    • 循环的 else 子句
    • pass 语句
  • 第5章 数据结构

    • 列表创建与索引
    • 列表方法
    • 列表推导式
    • 元组
    • 序列解包
    • 集合
    • 字典创建与访问
    • 字典方法
    • 字典推导式
    • range 对象
  • 第6章 函数

    • 定义函数
    • 位置参数与关键字参数
    • 默认参数
    • 可变参数
    • 解包实参
    • 函数返回值
    • lambda 表达式
    • 文档字符串与注解
    • 作用域与命名空间
    • global 与 nonlocal
  • 第7章 模块与包

    • 模块导入
    • 模块搜索路径
    • 包与相对导入
    • 标准库概览
  • 第8章 文件与输入输出

    • 文件读写
    • 上下文管理器
    • 字符串格式化
    • JSON 与 CSV
  • 第9章 面向对象

    • 类与对象
    • 方法
    • 实例变量与类变量
    • 私有变量
    • 继承
    • 多重继承
    • 魔术方法
    • 属性装饰器
    • 数据类 dataclass
  • 第10章 异常处理

    • 语法错误与异常
    • try-except
    • 异常链与 raise
    • 清理操作
    • 自定义异常
  • 第11章 迭代器与生成器

    • 迭代器协议
    • 生成器
    • 生成器表达式
    • 迭代工具
  • 第12章 高级特性

    • 装饰器
    • 函数式编程
  • 第13章 工程实践

    • 测试与调试
    • 代码质量
    • 虚拟环境

函数返回值

return 语句终止当前函数的执行,并把后面的表达式结果传回给调用者。Python 的 return 比许多语言更灵活:可以返回单个值、多个值,也可以什么都不返回。

return 的基本语法

return 后面可以跟一个表达式,也可以什么都不跟:

def add(a, b):
    return a + b

print(add(3, 5))  # 8

当 return 不带表达式时,函数返回 None:

def early_exit(flag):
    if not flag:
        return          # 提前结束,返回 None
    print("继续执行")
    return "完成"

print(early_exit(False))  # None
print(early_exit(True))   # 先打印"继续执行",再返回"完成"

函数执行到末尾没有遇到 return 时,同样返回 None。这与显式写 return 不带表达式效果相同。

多返回值:元组解包

Python 函数可以"返回多个值",语法上实际是返回一个元组,调用处可以用多个变量并行接收:

def divide(a, b):
    quotient = a // b
    remainder = a % b
    return quotient, remainder   # 等价于 return (quotient, remainder)

q, r = divide(17, 5)
print(q, r)  # 3 2

返回的元组也可以整体赋值给一个变量:

result = divide(17, 5)
print(result)        # (3, 2)
print(type(result))  # <class 'tuple'>

这种机制在需要同时返回计算结果和状态信息时非常有用:

def parse_number(s):
    try:
        n = int(s)
        return True, n
    except ValueError:
        return False, None

ok, value = parse_number("42")
print(ok, value)     # True 42

ok, value = parse_number("abc")
print(ok, value)     # False None

提前返回与守卫语句

return 可以出现在函数体的任何位置,常用于守卫语句(guard clause)——在函数开头检查非法输入,立即返回,避免深层嵌套:

def calculate_discount(price, rate):
    if price < 0:
        return 0                    # 守卫:非法价格
    if rate < 0 or rate > 1:
        return price                # 守卫:非法折扣率
    return price * (1 - rate)

print(calculate_discount(100, 0.2))   # 80.0
print(calculate_discount(-10, 0.2))    # 0
print(calculate_discount(100, 1.5))   # 100

对比不使用提前返回的写法,守卫语句让主逻辑保持扁平,可读性更强。

返回 None 的语义

None 在 Python 中常表示"无结果"或"操作失败"。设计函数时,返回 None 应有意为之,且调用者需要正确处理:

def find_index(items, target):
    for i, item in enumerate(items):
        if item == target:
            return i
    return None   # 未找到,显式返回 None

idx = find_index(["a", "b", "c"], "d")
if idx is None:
    print("未找到")
else:
    print(f"索引为 {idx}")

注意:不要用 == 判断 None,应使用 is。None 是单例对象,is 判断更精确且语义清晰。

# 错误示范
if idx == None:       # 能工作,但不推荐
    pass

# 正确做法
if idx is None:       # 推荐
    pass

返回函数对象

return 可以返回任何对象,包括另一个函数。这是闭包和装饰器的基础:

def make_multiplier(factor):
    def multiply(x):
        return x * factor
    return multiply

triple = make_multiplier(3)
print(triple(5))  # 15

常见错误

在 return 后写不可达代码:

def broken(x):
    return x * 2
    print("永远不会执行")   # 逻辑错误,但语法合法

试图在 return 后写多个表达式而不打包:

def wrong():
    return 1, 2, 3   # 这其实是合法的,返回元组 (1, 2, 3)

# 真正的错误:试图用分号分隔(Python 不支持)
# def broken():
#     return 1; return 2   # SyntaxError

在交互式解释器中,直接调用无返回值的函数会显示 None,容易让人困惑:

>>> def greet(name):
...     print(f"Hello, {name}")
...
>>> greet("Alice")
Hello, Alice
>>> result = greet("Alice")
Hello, Alice
>>> print(result)
None

第一个调用显示 Hello, Alice 是因为 print 的输出;第二个调用把 None 赋给 result,再打印 result 时才看到 None。

小结

return 终止函数并传回值;无 return 或空 return 返回 None;多返回值本质是返回元组;提前返回能简化嵌套逻辑。正确区分"打印"与"返回",是避免函数相关 bug 的关键。

上一页
解包实参
下一页
lambda 表达式