今日目标:深入理解 Python 的核心数据结构 —— 字典 (Dictionary),并学会使用 装饰器 (Decorator) 来优雅地增加重试机制和鉴权逻辑。今天不只是写代码,而是要彻底理解 “字典为什么是 Python 的灵魂”、“装饰器如何优雅地扩展函数功能” 以及 “异常处理如何让代码更健壮”。
学习内容 (30 mins)
在开始写代码前,先搞懂这些核心概念,否则后面的代码你会看得云里雾里。字典进阶 (15 mins)
字典进阶 (15 mins)
什么是字典?字典(Dictionary)是 Python 中的键值对(key-value)数据结构,类似于其他语言中的 Map 或 Hash Table。为什么字典是 Python 的灵魂?
- 查找速度快:O(1) 时间复杂度,比列表的 O(n) 快得多
- 灵活性强:可以存储任意类型的数据
- 应用广泛:JSON、配置文件、API 响应都是字典结构
- Pythonic:字典推导式让代码更简洁优雅
get(key, default):- 作用:安全获取字典值,如果 key 不存在返回默认值
- 为什么需要:
dict['key']如果 key 不存在会报KeyError,get()更安全 - 示例:
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}
- 语法:
装饰器 (10 mins)
装饰器 (10 mins)
什么是装饰器?装饰器(Decorator)是一个函数,它接受一个函数作为参数,并返回一个新的函数,用于在不修改原函数代码的情况下扩展功能。为什么需要装饰器?
- 代码复用:将通用功能(如重试、日志、计时)抽取出来
- 关注点分离:业务逻辑和横切关注点(cross-cutting concerns)分离
- 优雅扩展:不需要修改原函数,只需添加装饰器
- Pythonic:装饰器是 Python 的特色功能,让代码更优雅
- 闭包(Closure):内部函数可以访问外部函数的变量
- 函数是一等公民:函数可以作为参数传递,也可以作为返回值
- 语法糖:
@decorator等价于func = decorator(func)
- 重试机制:网络请求失败自动重试
- 性能监控:统计函数执行时间
- 权限校验:检查用户是否有权限执行函数
- 日志记录:自动记录函数调用和参数
异常处理 (5 mins)
异常处理 (5 mins)
什么是异常处理?异常处理是捕获和处理程序运行时的错误,防止程序崩溃。为什么必须正确处理异常?
- 程序健壮性:即使出错也能优雅处理,不会崩溃
- 资源清理:确保文件、数据库连接等资源被正确释放
- 用户体验:给用户友好的错误提示,而不是程序崩溃
- 永远不要写裸露的
except::- 会捕获所有异常,包括系统退出(SystemExit)、键盘中断(KeyboardInterrupt)等
- 至少捕获
Exception:except Exception as e:
- 使用
finally清理资源:- 无论是否发生异常,
finally块都会执行 - 适合关闭文件、数据库连接等操作
- 无论是否发生异常,
- 具体异常优于通用异常:
except KeyError:比except Exception:更精确- 可以针对不同异常做不同处理
代码任务 (90 mins)
任务 A:字典处理实战
编写 代码解释:验证步骤:
09_dict_ops.py,处理模拟的服务器监控数据。任务分解:- 使用字典安全访问方法处理监控数据
- 使用字典推导式筛选高负载服务器
- 处理嵌套字典结构
- 字典推导式:
{k: v for item in list if condition}一行完成筛选和转换 get()方法:安全访问字典,避免KeyErrorsetdefault()方法:初始化嵌套字典结构update()方法:合并字典,相同 key 会被覆盖
- 脚本能正常运行,无语法错误
- 输出包含所有主机列表
- 输出包含高负载服务器(db-01)
- 输出包含安全访问的配置信息
- 输出包含嵌套字典处理结果
任务 B:编写重试装饰器
在运维脚本中,网络波动很常见。编写一个 装饰器原理解析:验证步骤:
@retry 装饰器,实现”报错自动重试 3 次”。任务分解:- 理解装饰器的基本结构
- 实现重试逻辑
- 添加异常处理和日志
- 三层嵌套函数:
retry(max_retries, delay):外层函数,接收装饰器参数decorator(func):中层函数,接收被装饰的函数wrapper(*args, **kwargs):内层函数,实际执行逻辑
@wraps(func)的作用:- 保留原函数的元信息(函数名、文档字符串等)
- 不使用
@wraps的话,func.__name__会变成wrapper
*args和**kwargs:*args:接收任意数量的位置参数**kwargs:接收任意数量的关键字参数- 这样装饰器可以装饰任何签名的函数
- 脚本能正常运行,无语法错误
- 观察重试过程:失败后会等待并重试
- 如果最终成功,会显示”第 X 次尝试成功”
- 如果所有重试都失败,会抛出最后一次异常
拓展任务 (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 08 | Python 环境与高频语法
下一天: 文件与正则
Day 10 | 文件处理与正则实战