本文目录导读:

我来详细介绍Python函数返回值的各种案例和最佳实践。
单一返回值
返回基本类型
def add(a, b):
return a + b
result = add(3, 5)
print(result) # 输出: 8
返回布尔值
def is_even(num):
return num % 2 == 0
print(is_even(4)) # True
print(is_even(7)) # False
多个返回值(元组)
基本多值返回
def get_user_info():
name = "张三"
age = 25
email = "zhangsan@example.com"
return name, age, email
# 解包接收
name, age, email = get_user_info()
print(f"姓名: {name}, 年龄: {age}, 邮箱: {email}")
# 也可以用单个变量接收元组
result = get_user_info()
print(result) # ('张三', 25, 'zhangsan@example.com')
print(result[0]) # 张三
返回列表或其他容器
def get_even_numbers(limit):
even_list = []
for i in range(limit):
if i % 2 == 0:
even_list.append(i)
return even_list
numbers = get_even_numbers(10)
print(numbers) # [0, 2, 4, 6, 8]
# 列表推导式版本
def get_even_numbers_v2(limit):
return [i for i in range(limit) if i % 2 == 0]
返回字典
def create_student(name, scores):
return {
'name': name,
'scores': scores,
'average': sum(scores) / len(scores) if scores else 0
}
student = create_student("小明", [85, 92, 78, 90])
print(student)
# {'name': '小明', 'scores': [85, 92, 78, 90], 'average': 86.25}
条件返回值
def divide(a, b):
if b == 0:
return None # 或 raise ValueError("除数不能为零")
return a / b
result = divide(10, 2)
print(result) # 5.0
result = divide(10, 0)
print(result) # None
返回自定义对象
class Result:
def __init__(self, success, data=None, error=None):
self.success = success
self.data = data
self.error = error
def process_data(value):
try:
# 模拟数据处理
result = value * 2
return Result(True, data=result)
except Exception as e:
return Result(False, error=str(e))
# 使用示例
res = process_data(5)
if res.success:
print(f"处理结果: {res.data}")
else:
print(f"错误: {res.error}")
返回函数(高阶函数)
def multiplier(factor):
def multiply_by_factor(number):
return number * factor
return multiply_by_factor
# 使用示例
double = multiplier(2)
triple = multiplier(3)
print(double(5)) # 10
print(triple(5)) # 15
生成器返回
def fibonacci_generator(limit):
a, b = 0, 1
count = 0
while count < limit:
yield a
a, b = b, a + b
count += 1
# 使用生成器
for num in fibonacci_generator(10):
print(num, end=" ") # 0 1 1 2 3 5 8 13 21 34
返回类型注解(Python 3.5+)
from typing import List, Dict, Tuple, Optional, Union
def get_stats(numbers: List[float]) -> Dict[str, float]:
return {
'mean': sum(numbers) / len(numbers),
'max': max(numbers),
'min': min(numbers)
}
def find_user(user_id: int) -> Optional[Dict[str, str]]:
# 可能返回 None 或字典
users = {1: {"name": "Alice"}, 2: {"name": "Bob"}}
return users.get(user_id)
def process_value(value: Union[int, str]) -> str:
if isinstance(value, int):
return f"Number: {value}"
return f"String: {value}"
最佳实践案例
完整的数据处理函数
from typing import List, Dict, Optional, Tuple
class ProcessResult:
"""处理结果封装类"""
def __init__(self, success: bool, data=None, error: Optional[str] = None):
self.success = success
self.data = data
self.error = error
def process_student_scores(scores: List[int]) -> ProcessResult:
"""
处理学生成绩
返回包含处理状态和结果的包装对象
"""
# 输入验证
if not scores:
return ProcessResult(False, error="成绩列表不能为空")
if any(score < 0 for score in scores):
return ProcessResult(False, error="成绩不能为负数")
# 计算统计数据
try:
stats = {
'total': sum(scores),
'average': sum(scores) / len(scores),
'max': max(scores),
'min': min(scores),
'count': len(scores)
}
# 计算等级
if stats['average'] >= 90:
grade = 'A'
elif stats['average'] >= 80:
grade = 'B'
else:
grade = 'C'
stats['grade'] = grade
return ProcessResult(True, data=stats)
except Exception as e:
return ProcessResult(False, error=str(e))
# 使用示例
def main():
scores = [85, 92, 78, 90, 88]
result = process_student_scores(scores)
if result.success:
print(f"处理成功:")
print(f" 总分: {result.data['total']}")
print(f" 平均分: {result.data['average']:.2f}")
print(f" 等级: {result.data['grade']}")
else:
print(f"处理失败: {result.error}")
if __name__ == "__main__":
main()
返回值选择指南
- 单一值: 使用直接返回
- 多个相关值: 使用元组或自定义类
- 不确定数量: 使用列表
- 键值对: 使用字典
- 状态+数据: 使用自定义Result类
- 惰性计算: 使用生成器
最佳实践
- 保持一致性: 同一个函数返回类型要一致
- 明确文档: 使用docstring说明返回类型
- 错误处理: 显式处理异常情况
- 类型注解: 使用type hints提高代码可读性
- 避免None: 优先考虑抛出异常或使用Optional类型
这样设计返回值可以让代码更清晰、更易维护!