📘 第一周:Python 核心与工程规范·错题本
1. ☠️ 必死题:可变默认参数 (Mutable Default Arguments)
- 你的错误:认为
def func(l=[]):里的[]每次调用都会重置。 - 真相:函数默认参数在 定义时 (Definition Time) 创建,且只创建一次。所有调用共享同一个列表对象。
- 后果:用例 A 的数据会跑到用例 B 里,导致测试环境污染,Bug 难以复现。
- 满分写法:
# ❌ 绝对禁止 def add_case(data, li=[]):li.append(data)# ✅ 标准范式 (Sentinel Pattern) def add_case(data, li=None):if li is None: # 必须用 is,不要用 ==li = []li.append(data)
2. 💾 内存管理:深浅拷贝与引用
- 核心概念:
- 赋值 (
=):只是贴标签,不创建新对象。 - 浅拷贝 (
list.copy()):造了新盒子,但里面的东西还是旧的引用。 - 深拷贝 (
copy.deepcopy()):完全递归复制,彻底隔离。
- 赋值 (
- 避坑场景:当测试数据包含嵌套结构(如
[{'config': {...}}])时,必须使用深拷贝,否则修改一个用例配置会影响全局模板。
3. 📊 数据处理:Zip 的隐形杀手
- 你的错误:不知道如果数据列比表头少,
zip会发生什么。 - 真相:
zip会按最短的那个序列截断。- 表头:
['ID', 'Name', 'Result'] - 数据:
[1, 'Test'](缺 Result) zip结果:{'ID': 1, 'Name': 'Test'}-> 'Result' 字段直接消失了!
- 表头:
- 满分写法 (工程级容错):
from itertools import zip_longestkeys = ['ID', 'Name', 'Result'] values = [1, 'Test']# fillvalue=None 自动把缺失的字段补为 None data = dict(zip_longest(keys, values, fillvalue=None)) # 结果: {'ID': 1, 'Name': 'Test', 'Result': None} -> 安全!
4. 📝 代码规范:Type Hints (类型提示)
- 你的错误:语法胡编乱造 (
Dict[str:Any])。 - 真相:类型提示是写给 IDE 和静态检查工具(Mypy)看的,语法必须严谨。
- 常用速查:
List[int]: 整数列表Dict[str, Any]: 键是字符串,值是任意类型 (注意中间是逗号)Optional[str]: 可以是字符串,也可以是 NoneUnion[int, float]: 可以是整数或浮点数
5. 🐙 Git 协作:标准工作流
- 你的错误:
git push main master(乱点鸳鸯谱),且没有.gitignore。 - 真相:没有
.gitignore提交__pycache__或.idea文件,会被同事视为极其不专业。 - 背诵流程:
git init(初始化)- 创建
.gitignore(这一步最容易忘!) git add .(暂存所有)git commit -m "feat: 描述"(提交)git remote add origin <URL>(连远程)git push -u origin main(推送到 main 分支并绑定)
🛠️ 周末实战作业(巩固提升)
为了让你真的掌握,不要只看,要动手改。
题目:
写一个 robust_excel_parser.py。
- 定义一个类
ExcelLoader。 - 使用
openpyxl读取 Excel。 - 核心要求:
- 使用
zip_longest防止数据丢失。 - 使用
Type Hints标注所有入参和返回值。 - 如果读取到的数据中
expected字段为None,将其自动转换为字符串"UNKNOWN"(数据清洗)。 - 最后把代码上传到你的 GitHub,确保没有上传垃圾文件。
- 使用