Week 6 学习成果|图算法与 Python Engineering Toolkit
Week 6 的实际产出:用邻接表 + visited 手写 BFS / DFS / 连通分量(O(V+E)),接触 csv / json / numpy / pandas,并把工具整理成 Reader → Processor → Storage → CLI 的分层,中间格式统一 list[dict],配置走 config.json + @dataclass,日志按模块 getLogger;阶段产物 Asset 1 · Python Engineering Toolkit 第一版。
本篇与一年学习计划总纲 Phase I 的 Week 6 · 图算法与数据处理工具 一致,按总纲「每周固定执行模板」编排。Week 6 暂无单独的计划篇,本篇记录实际成果,也是 Phase I 的收尾——阶段产物 Asset 1 · Python Engineering Toolkit。
🎯 本周目标
L2 / L3
- ✅ 手写 BFS、DFS、连通分量
- ✅ AI-Off 能实现 BFS / DFS
- ✅ 能独立修改项目模块
📚 Core Knowledge
- 图的表示:邻接表
- BFS、DFS、连通分量
- 数据处理工具:csv、json、numpy、pandas
- 工程分层:Reader → Processor → Storage → CLI
- 配置分离与日志
✍️ Human Core
- 手写 BFS
- 手写 DFS
- 手写连通分量
🤖 AI Build
- 实现 Reader → Processor → Storage → CLI 分层
- 中间格式统一为
list[dict] -
config.json+@dataclass AppConfig - 各模块
logging.getLogger(__name__),入口统一basicConfig
📝 数智工程师考试映射
- 图的遍历(BFS / DFS)与连通分量
- 数据处理工具与文件读写
- 项目分层与工程化
✅ Acceptance
- AI-Off 能实现 BFS / DFS
- 能独立修改项目模块
- 能说清各层职责与依赖方向
🧠 本周最重要的问题
BFS 和 DFS 只差一个容器的选择,为什么结果差这么多?
两者都靠邻接表 + visited 保证 O(V+E)。BFS 用队列 → 按层扩散,天然得到无权图最短路径;DFS 用栈 / 递归 → 一路走到底再回溯,适合连通性和拓扑类问题。
❓ 尚未解决
- 只做了入门级 csv / json / numpy / pandas,还没处理过大文件的流式读写。
- 分层是否要加 Service / 校验层,还没定。
📊 Final Level
L2 / L3
BFS / DFS / 连通分量
图用邻接表存,遍历时用一个 visited 集合防止走回头路,复杂度都是 O(V+E)。
from collections import deque
def bfs(graph, start):
visited, order = {start}, []
q = deque([start])
while q:
u = q.popleft()
order.append(u)
for v in graph[u]:
if v not in visited:
visited.add(v)
q.append(v)
return order
def dfs(graph, start, visited=None):
if visited is None:
visited = set()
visited.add(start)
for v in graph[start]:
if v not in visited:
dfs(graph, v, visited)
return visited
连通分量:对每个未访问点各跑一次遍历,遍历次数就是分量个数。
数据处理工具
csv/json:读写最常见的两种文本数据格式numpy:数组与向量化运算pandas:表结构数据(DataFrame)的读写、筛选、分组
工程分层
Reader → Processor → Storage → CLI
| 层 | 职责 |
|---|---|
| Reader | 只负责把原始文件读进来 |
| Processor | 只负责数据处理 |
| Storage | 只负责写出去 |
| CLI | 解析参数、把上面几层串起来 |
各层之间统一用 list[dict] 作为中间格式,让「从哪读、怎么处理、写到哪」互相解耦。
配置分离
值和“怎么读”分开:config.json 只放值,config.py 用 @dataclass 承载:
import json
from dataclasses import dataclass
@dataclass
class AppConfig:
source: str = "input.csv"
log_level: str = "INFO"
def load_config(path: str = "config.json") -> AppConfig:
with open(path, encoding="utf-8") as f:
return AppConfig(**json.load(f))
日志
每个模块只声明自己的 logger,入口统一配置一次:
# 各模块顶部
import logging
logger = logging.getLogger(__name__)
# 入口只调一次
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(name)s %(levelname)s %(message)s",
)
铁律:底层模块只 getLogger,绝不 basicConfig——谁先被 import,谁就决定全局日志格式(Week 2 重构实验 A/B 已确认过)。
阶段产物|Asset 1 · Python Engineering Toolkit 第一版
具备读文件、数据处理、写文件、CLI 参数控制的基础工具框架:分层沿用 Reader → Processor → Storage → CLI,中间格式统一 list[dict],配置走 config.json + @dataclass,日志按模块 getLogger。
来源与延伸阅读
- 01Week 1 学习计划|Python 对象模型与数据结构
- 02一年学习计划:从 Python 到 Data/AI 系统的 52 周
- 03Week 1 学习成果|复杂度实测、对象模型与数据结构实战
- 04Week 2 学习计划|Python 函数、作用域、闭包与模块化
- 05Week 2 学习成果|闭包、decorator 与工程化重构
- 06Week 3 学习计划|异常、测试与 Debugging
- 07Week 3 学习成果|异常、traceback 与 Debug 起步
- 08Week 4 学习成果|Big-O 与四类基础算法
- 09Week 5 学习成果|Stack、Queue 与 MinHeap
- 10Week 6 学习成果|图算法与 Python Engineering Toolkit