侧边栏壁纸
博主头像
路小飞博主等级

行动起来,活在当下

  • 累计撰写 72 篇文章
  • 累计创建 12 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

1.5 Python 函数定义与调用

路小飞
2025-06-16 / 0 评论 / 0 点赞 / 6 阅读 / 5813 字

函数是 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. 最佳实践建议

  1. 函数命名要清晰,使用动词开头,如 process_datavalidate_inputconvert_format
  2. 每个函数专注于单一职责,如数据验证、格式转换、文件处理等
  3. 必须添加文档字符串,说明函数用途、参数和返回值
  4. 做好异常处理,确保函数在出错时能够优雅降级
  5. 对于配置项,使用默认参数提高灵活性
  6. 返回值要统一,建议使用字典或元组返回多个值
  7. 关键函数要添加日志记录,方便问题排查

6. 常见应用场景

  1. 数据处理:数据清洗、格式转换、验证
  2. 文件操作:读写文件、解析内容、批量处理
  3. 业务逻辑:用户认证、订单处理、状态管理
  4. 工具函数:日期处理、字符串操作、数学计算
  5. 配置管理:参数验证、环境配置、选项处理
  6. 数据转换:格式转换、编码处理、序列化
  7. 辅助功能:日志记录、性能监控、调试工具
0

评论区