今日目标:Python 是运维工程师的”瑞士军刀”。今天我们不从零学起,而是重点掌握那些在 Infra 开发中 80% 会用到的 高频语法 和 标准工程结构。今天不只是写代码,而是要彻底理解 “为什么需要虚拟环境”、“类型注解的价值” 以及 “上下文管理器如何防止资源泄漏”。
学习内容 (30 mins)
在开始写代码前,先搞懂这些核心概念,否则后面的代码你会看得云里雾里。虚拟环境与包管理 (15 mins)
虚拟环境与包管理 (15 mins)
什么是虚拟环境?虚拟环境是一个独立的 Python 运行环境,它有自己的解释器和包安装目录,与系统 Python 完全隔离。为什么必须使用虚拟环境?
- 避免依赖冲突:不同项目可能需要不同版本的同一个包(如
requests 2.25.1vsrequests 2.28.0) - 项目隔离:每个项目的依赖互不干扰,不会污染系统 Python
- 可重现性:通过
requirements.txt可以精确复现项目环境 - 团队协作:团队成员可以安装完全相同的依赖版本
- venv(推荐):
- 优点:Python 3.3+ 内置,无需额外安装,轻量级
- 缺点:功能相对简单
- 适用场景:大多数项目,特别是运维脚本
- Conda:
- 优点:可以管理 Python 版本本身,适合数据科学
- 缺点:体积大,启动慢
- 适用场景:数据科学、机器学习项目
- 安装包:
pip install package_name - 冻结依赖:
pip freeze > requirements.txt(记录所有已安装包的精确版本) - 安装依赖:
pip install -r requirements.txt(从文件安装) - 为什么需要冻结:确保开发、测试、生产环境使用相同版本的包,避免”在我机器上能跑”的问题
Python 高频语法 (15 mins)
Python 高频语法 (15 mins)
类型注解 (Type Hints)
- 是什么:在函数参数和返回值上标注类型信息
- 为什么需要:
- IDE 智能提示:输入参数时能看到类型,减少错误
- 代码可读性:一眼看出函数期望什么类型
- 静态检查:使用
mypy可以在运行前发现类型错误 - 文档作用:类型本身就是最好的文档
- 语法:
def function_name(param: type) -> return_type: - 注意:Python 是动态语言,类型注解不会在运行时检查,只是提示作用
- 是什么:Python 3.6+ 引入的字符串格式化语法
- 为什么优于旧方法:
- 可读性强:
f"Hello {name}"比"Hello {}".format(name)更直观 - 性能更好:f-string 在编译时优化,比
%和.format()更快 - 支持表达式:
f"Result: {x + y}"可以直接计算
- 可读性强:
- 语法:
f"文本 {变量} 文本"
- 是什么:使用
with语句自动管理资源的获取和释放 - 为什么必须使用:
- 防止资源泄漏:文件、数据库连接、网络连接等资源必须正确关闭
- 异常安全:即使发生异常,
with也会确保资源被释放 - 代码简洁:不需要手动写
try-finally
- 原理:
with open()会在进入时调用__enter__(),退出时调用__exit__() - 常见场景:
- 文件操作:
with open("file.txt") as f: - 数据库连接:
with db.get_cursor() as cursor: - 锁:
with lock:
- 文件操作:
代码任务 (90 mins)
环境准备
在开始之前,确保你的环境已准备好:
- Python 环境:需要 Python 3.7+(推荐 3.9+)
- 文本编辑器:继续使用 nano 或 vi/vim(如果还不熟悉,参考 Day 01 的编辑器说明)
- 检查 Python 版本:
python3 --version
任务 A:创建虚拟环境
在项目目录下创建一个独立的 Python 环境。验证步骤:
- 检查 Python 路径:
which python应该指向.venv/bin/python - 检查 pip 路径:
which pip应该指向.venv/bin/pip - 检查提示符:命令行前面应该有
(.venv)标识
任务 B:包管理与依赖冻结
安装一个常用包并导出依赖列表。为什么需要 requirements.txt?
- 团队协作:团队成员可以安装完全相同的依赖
- 环境复现:生产环境可以精确复现开发环境
- 版本锁定:避免因依赖更新导致的”昨天还能跑,今天就不行了”
- 检查
requirements.txt文件是否存在 - 检查文件内容是否包含
requests==开头的行 - 尝试在新虚拟环境中安装:
pip install -r requirements.txt
任务 C:编写 Python 脚本 - 类型注解与 f-string
创建 代码解释:验证步骤:
08_syntax_review.py,练习类型注解和 f-string。- 类型注解:
def calculate_memory(total: int, usage: float) -> str:明确标注参数和返回值类型 - f-string:
f"文本 {变量}"比字符串拼接更清晰 - 列表推导式:
[表达式 for 变量 in 列表 if 条件]一行完成筛选和转换
- 脚本能正常运行,无语法错误
- 输出包含内存使用率计算结果
- 输出包含 f-string 格式化的服务器信息
- 输出包含列表推导式筛选的结果
任务 D:上下文管理器 - 文件操作
创建 为什么必须使用 验证步骤:
08_file_context.py,演示 with 语句的正确用法。with?- 自动关闭:即使发生异常,文件也会被关闭
- 防止泄漏:避免”Too many open files”错误
- 代码简洁:不需要手动写
try-finally
"r":只读(文件必须存在)"w":写入(覆盖,文件不存在则创建)"a":追加(在文件末尾添加,文件不存在则创建)"r+":读写(文件必须存在)
- 脚本运行后,检查
app.log文件是否存在 - 查看文件内容:
cat app.log - 确认文件包含写入的日志行
- 确认错误计数正确
拓展任务 (30 mins)
挑战 1:列表推导式进阶
任务:使用列表推导式,从列表
['apple', 'banana', 'cherry', 'date'] 中选出:- 长度大于 5 的单词
- 包含字母 ‘n’ 的单词
- 同时满足以上两个条件,并转为大写
挑战 2:类型注解实践
任务:为以下函数添加类型注解:提示:
- 使用
List[Dict[str, Any]]需要导入:from typing import List, Dict, Any - 思考:
threshold应该是什么类型?
今日产出物
.venv/- Python 虚拟环境目录requirements.txt- 项目依赖列表08_syntax_review.py- 类型注解和 f-string 示例08_file_context.py- 上下文管理器示例app.log- 日志文件(由脚本生成)
参考代码
查看参考代码
在 GitHub 查看完整的示例代码
在线运行
使用在线编辑器测试代码
实际应用场景
虚拟环境在运维中的应用
- 多项目隔离:不同运维脚本使用不同版本的库,互不干扰
- 生产环境复现:通过
requirements.txt在生产环境安装相同依赖 - CI/CD 集成:自动化部署时自动创建虚拟环境并安装依赖
- 版本锁定:避免因依赖更新导致的意外问题
类型注解与上下文管理器的最佳实践
- 类型注解:在函数参数和返回值上标注类型,提高代码可读性和 IDE 支持
- f-string:优先使用 f-string 进行字符串格式化,代码更清晰
- 上下文管理器:所有资源操作(文件、数据库、网络)都必须使用
with语句 - 列表推导式:简单筛选和转换优先使用列表推导式,代码更 Pythonic
上一周: Shell收官
Day 07 | 第一阶段复盘
下一天: 数据结构进阶
Day 09 | 数据结构与装饰器