函数是 Python 中最基本的代码组织单位,它可以将一段完成特定功能的代码封装起来,方便重复使用。合理使用函数可以让代码更加清晰、易于维护。
1.4.1 基础函数定义
def 函数名(参数1, 参数2, ...):
"""函数文档说明"""
函数体
return 返回值
实际案例 - 数据处理函数:
def process_user_data(user_info):
"""处理用户数据
Args:
user_info: 包含用户信息的字典
Returns:
dict: 处理后的用户信息
"""
try:
# 数据清洗和转换
processed = {
'name': user_info.get('name', '').strip(),
'age': int(user_info.get('age', 0)),
'email': user_info.get('email', '').lower(),
'score': float(user_info.get('score', 0))
}
return processed
except (ValueError, TypeError) as e:
return {'error': f'数据处理失败: {str(e)}'}
1.4.2. 常用参数类型
1 基本参数
基本参数是最简单的参数类型,按照定义顺序传入,数量和顺序必须匹配。
def greet(name, age):
"""打印问候语
Args:
name: 姓名
age: 年龄
"""
print(f"你好,{name},你今年{age}岁了")
# 正确调用
greet("小明", 18) # 输出: 你好,小明,你今年18岁了
2 默认参数
适用于需要预设默认值的场景,如配置项、可选参数等。
def send_notification(message, level='info', timeout=5, retry=3):
"""发送通知消息
Args:
message: 通知内容
level: 通知级别,默认'info'
timeout: 超时时间(秒),默认5秒
retry: 重试次数,默认3次
"""
levels = {
'info': 'ℹ️',
'warning': '⚠️',
'error': '❌'
}
icon = levels.get(level, 'ℹ️')
for i in range(retry):
try:
print(f"{icon} {message}")
return True
except Exception as e:
print(f"第{i+1}次发送失败: {e}")
return False
3 可变参数
适用于处理不确定数量的参数,如批量处理数据。
def calculate_statistics(*numbers):
"""计算一组数字的统计信息
Args:
*numbers: 要计算的数字列表
Returns:
dict: 包含最大值、最小值、平均值等统计信息
"""
if not numbers:
return {'error': '没有提供数据'}
return {
'max': max(numbers),
'min': min(numbers),
'avg': sum(numbers) / len(numbers),
'count': len(numbers)
}
3. 返回值处理
3.1 多返回值
常用于返回操作状态和详细信息。
def validate_data(data):
"""验证数据有效性
Args:
data: 要验证的数据
Returns:
tuple: (是否有效, 错误信息, 处理后的数据)
"""
if not isinstance(data, dict):
return False, "数据格式错误", None
required_fields = ['name', 'age', 'email']
missing_fields = [field for field in required_fields if field not in data]
if missing_fields:
return False, f"缺少必填字段: {', '.join(missing_fields)}", None
# 数据清理
cleaned_data = {
'name': data['name'].strip(),
'age': int(data['age']),
'email': data['email'].lower()
}
return True, "验证通过", cleaned_data
4. 实战函数示例
4.1 文件处理函数
def process_file(file_path, encoding='utf-8'):
"""处理文件内容
Args:
file_path: 文件路径
encoding: 文件编码,默认utf-8
Returns:
dict: 文件处理结果
"""
try:
with open(file_path, 'r', encoding=encoding) as f:
content = f.read()
# 基础文本分析
result = {
'size': len(content),
'lines': len(content.splitlines()),
'words': len(content.split()),
'chars': len(content)
}
return result
except Exception as e:
return {'error': f'文件处理失败: {str(e)}'}
4.2 数据转换函数
def convert_data_format(data, target_format='json'):
"""转换数据格式
Args:
data: 要转换的数据
target_format: 目标格式,支持'json'、'yaml'、'xml'
Returns:
str: 转换后的数据
"""
import json
import yaml
import xml.etree.ElementTree as ET
try:
if target_format == 'json':
return json.dumps(data, ensure_ascii=False, indent=2)
elif target_format == 'yaml':
return yaml.dump(data, allow_unicode=True)
elif target_format == 'xml':
# 简化的XML转换示例
root = ET.Element('data')
for key, value in data.items():
child = ET.SubElement(root, key)
child.text = str(value)
return ET.tostring(root, encoding='unicode')
else:
return f"不支持的格式: {target_format}"
except Exception as e:
return f"转换失败: {str(e)}"
5. 最佳实践建议
- 函数命名要清晰,使用动词开头,如
process_data、validate_input、convert_format - 每个函数专注于单一职责,如数据验证、格式转换、文件处理等
- 必须添加文档字符串,说明函数用途、参数和返回值
- 做好异常处理,确保函数在出错时能够优雅降级
- 对于配置项,使用默认参数提高灵活性
- 返回值要统一,建议使用字典或元组返回多个值
- 关键函数要添加日志记录,方便问题排查
6. 常见应用场景
- 数据处理:数据清洗、格式转换、验证
- 文件操作:读写文件、解析内容、批量处理
- 业务逻辑:用户认证、订单处理、状态管理
- 工具函数:日期处理、字符串操作、数学计算
- 配置管理:参数验证、环境配置、选项处理
- 数据转换:格式转换、编码处理、序列化
- 辅助功能:日志记录、性能监控、调试工具
评论区