Skip to main content
今日目标:深入理解 Python 的核心数据结构 —— 字典 (Dictionary),并学会使用 装饰器 (Decorator) 来优雅地增加重试机制和鉴权逻辑。今天不只是写代码,而是要彻底理解 “字典为什么是 Python 的灵魂”“装饰器如何优雅地扩展函数功能” 以及 “异常处理如何让代码更健壮”

学习内容 (30 mins)

在开始写代码前,先搞懂这些核心概念,否则后面的代码你会看得云里雾里。
什么是字典?字典(Dictionary)是 Python 中的键值对(key-value)数据结构,类似于其他语言中的 Map 或 Hash Table。为什么字典是 Python 的灵魂?
  • 查找速度快:O(1) 时间复杂度,比列表的 O(n) 快得多
  • 灵活性强:可以存储任意类型的数据
  • 应用广泛:JSON、配置文件、API 响应都是字典结构
  • Pythonic:字典推导式让代码更简洁优雅
字典核心操作详解
  • get(key, default)
    • 作用:安全获取字典值,如果 key 不存在返回默认值
    • 为什么需要:dict['key'] 如果 key 不存在会报 KeyErrorget() 更安全
    • 示例:data.get('port', 3306) 如果 ‘port’ 不存在,返回 3306
  • setdefault(key, default)
    • 作用:如果 key 不存在,设置默认值并返回;如果存在,返回原值
    • 应用场景:初始化嵌套字典结构
    • 示例:data.setdefault('config', {}) 确保 ‘config’ 键存在
  • update(other_dict)
    • 作用:用另一个字典更新当前字典
    • 应用场景:合并配置、更新参数
    • 注意:相同的 key 会被覆盖
  • 字典推导式
    • 语法:{key_expr: value_expr for item in iterable if condition}
    • 优势:一行代码完成筛选和转换,比 for 循环更 Pythonic
    • 示例:{k: v*2 for k, v in data.items() if v > 10}
什么是装饰器?装饰器(Decorator)是一个函数,它接受一个函数作为参数,并返回一个新的函数,用于在不修改原函数代码的情况下扩展功能。为什么需要装饰器?
  • 代码复用:将通用功能(如重试、日志、计时)抽取出来
  • 关注点分离:业务逻辑和横切关注点(cross-cutting concerns)分离
  • 优雅扩展:不需要修改原函数,只需添加装饰器
  • Pythonic:装饰器是 Python 的特色功能,让代码更优雅
装饰器原理
  • 闭包(Closure):内部函数可以访问外部函数的变量
  • 函数是一等公民:函数可以作为参数传递,也可以作为返回值
  • 语法糖@decorator 等价于 func = decorator(func)
装饰器应用场景
  • 重试机制:网络请求失败自动重试
  • 性能监控:统计函数执行时间
  • 权限校验:检查用户是否有权限执行函数
  • 日志记录:自动记录函数调用和参数
什么是异常处理?异常处理是捕获和处理程序运行时的错误,防止程序崩溃。为什么必须正确处理异常?
  • 程序健壮性:即使出错也能优雅处理,不会崩溃
  • 资源清理:确保文件、数据库连接等资源被正确释放
  • 用户体验:给用户友好的错误提示,而不是程序崩溃
异常处理规范
  • 永远不要写裸露的 except:
    • 会捕获所有异常,包括系统退出(SystemExit)、键盘中断(KeyboardInterrupt)等
    • 至少捕获 Exceptionexcept Exception as e:
  • 使用 finally 清理资源
    • 无论是否发生异常,finally 块都会执行
    • 适合关闭文件、数据库连接等操作
  • 具体异常优于通用异常
    • except KeyError:except Exception: 更精确
    • 可以针对不同异常做不同处理

代码任务 (90 mins)

1

环境准备

确保虚拟环境已激活,并安装必要的包:
2

任务 A:字典处理实战

编写 09_dict_ops.py,处理模拟的服务器监控数据。任务分解
  1. 使用字典安全访问方法处理监控数据
  2. 使用字典推导式筛选高负载服务器
  3. 处理嵌套字典结构
代码解释
  • 字典推导式{k: v for item in list if condition} 一行完成筛选和转换
  • get() 方法:安全访问字典,避免 KeyError
  • setdefault() 方法:初始化嵌套字典结构
  • update() 方法:合并字典,相同 key 会被覆盖
运行脚本
验证步骤
  1. 脚本能正常运行,无语法错误
  2. 输出包含所有主机列表
  3. 输出包含高负载服务器(db-01)
  4. 输出包含安全访问的配置信息
  5. 输出包含嵌套字典处理结果
常见错误
  • KeyError: 'port' - 直接访问不存在的键,应使用 get() 方法
  • TypeError: 'NoneType' object is not subscriptable - get() 返回 None 后继续访问,应提供默认值
  • AttributeError: 'dict' object has no attribute 'append' - 字典没有 append() 方法,应使用 update() 或直接赋值
3

任务 B:编写重试装饰器

在运维脚本中,网络波动很常见。编写一个 @retry 装饰器,实现”报错自动重试 3 次”。任务分解
  1. 理解装饰器的基本结构
  2. 实现重试逻辑
  3. 添加异常处理和日志
装饰器原理解析
  • 三层嵌套函数
    1. retry(max_retries, delay):外层函数,接收装饰器参数
    2. decorator(func):中层函数,接收被装饰的函数
    3. wrapper(*args, **kwargs):内层函数,实际执行逻辑
  • @wraps(func) 的作用
    • 保留原函数的元信息(函数名、文档字符串等)
    • 不使用 @wraps 的话,func.__name__ 会变成 wrapper
  • *args**kwargs
    • *args:接收任意数量的位置参数
    • **kwargs:接收任意数量的关键字参数
    • 这样装饰器可以装饰任何签名的函数
运行脚本
验证步骤
  1. 脚本能正常运行,无语法错误
  2. 观察重试过程:失败后会等待并重试
  3. 如果最终成功,会显示”第 X 次尝试成功”
  4. 如果所有重试都失败,会抛出最后一次异常
常见错误
  • TypeError: retry() missing 1 required positional argument: 'func' - 装饰器参数使用错误,应使用 @retry(max_retries=3)
  • NameError: name 'wraps' is not defined - 忘记导入 from functools import wraps
  • AttributeError: 'function' object has no attribute '__name__' - 可能是装饰器结构错误
4

任务 C:异常处理实战

编写 09_exception.py,演示正确的异常处理方式。
异常处理最佳实践
  • 具体异常优于通用异常except KeyError:except Exception: 更精确
  • 使用 finally 清理资源:确保文件、数据库连接等被正确关闭
  • 异常链:使用 raise ... from e 保留原始异常信息
  • 自定义异常:为特定业务场景定义专门的异常类
运行脚本
验证步骤
  1. 脚本能正常运行,无语法错误
  2. 观察不同异常的处理方式
  3. 确认 finally 块总是执行
  4. 确认自定义异常能正确抛出和捕获

拓展任务 (30 mins)

挑战 1:字典推导式进阶

任务:从以下数据中,使用字典推导式提取所有 CPU 使用率超过 50% 的服务器,并计算平均 CPU 使用率。
提示
  • 使用字典推导式筛选:{k: v for item in list if condition}
  • 计算平均值:sum(values) / len(values)

挑战 2:装饰器组合

任务:创建一个 @timing 装饰器,统计函数执行时间,并和 @retry 装饰器组合使用。提示
  • 使用 time.time() 记录开始和结束时间
  • 装饰器可以叠加:@timing@retry 可以同时使用
  • 思考:装饰器的执行顺序是什么?

今日产出物

  • 09_dict_ops.py - 字典操作示例
  • 09_decorator.py - 装饰器实现
  • 09_exception.py - 异常处理示例

参考代码

查看参考代码

在 GitHub 查看完整的示例代码

在线运行

使用在线编辑器测试代码

实际应用场景

字典在运维中的应用

  • 配置管理:使用字典存储服务器配置、环境变量
  • API 响应处理:解析 JSON 格式的 API 响应(本质是字典)
  • 监控数据:存储和查询服务器监控指标(CPU、内存、磁盘等)
  • 数据转换:使用字典推导式快速筛选和转换数据

装饰器在运维中的应用

  • 重试机制:网络请求、数据库连接失败自动重试
  • 性能监控:统计脚本执行时间,定位性能瓶颈
  • 日志记录:自动记录函数调用、参数和返回值
  • 权限校验:检查用户是否有权限执行特定操作
  • 缓存机制:缓存函数结果,避免重复计算
与 Day 10 的关联:今天学习的字典操作和异常处理,明天会学习如何用 Python 处理文件(JSON、YAML、CSV)和正则表达式。字典是处理这些数据格式的基础。

上一天: 基础补漏

Day 08 | Python 环境与高频语法

下一天: 文件与正则

Day 10 | 文件处理与正则实战