基础与对象
变量绑定、动态类型与对象模型
【知识点】名字绑定到对象:赋值不是复制值|类型属于对象、不属于名字|type() 与 id()|del 删除名字不删对象|== 比较值、is 比较身份|None 是单例、判空用 is None|可变与不可变类型清单|小整数缓存与字符串驻留使 is 不可预测 【与 C 的差异】C 变量声明自带类型与存储,Python 只有名字绑定|C 有指针与取地址,Python 没有;b = a 共享的是对象而非地址|C 的 char[] 可改,Python str 不可变|C 的 == 比指针或值,Python 拆成 == 与 is|C 的 NULL 是宏 0,Python None 是单例对象 【提示词】你是 Python 3.12 导师,面向有 C 语言基础、学到数据结构的学习者。请系统讲解「变量绑定、动态类型与对象模型」:① 先列大纲再逐条深入;② 每条给简短可运行代码与预期输出;③ 凡与 C 语义不同处显式对照(声明与存储、指针与引用、可变性、== 与 is);④ 给 3–5 个 C 背景最易踩的坑;⑤ 最后给 5 道自测题与答案,并附 2 个 docs.python.org 链接。不确定的内容明说,不要编造。
建议预留 90 分钟
学习目标
- 能解释名字绑定与 C 变量声明的区别
- 能用 id()/is 说明两个名字何时指向同一对象
- 能说出哪些内置类型可变
关键概念
- 名字绑定
- 动态类型
- 对象模型
- == 与 is
- 可变与不可变
- None
为什么学习
- 全部 Python 语义的地基;C 背景最常翻车处,必须先纠正心智模型。
如何检验理解
- 跑 a=[1,2]; b=a; b.append(3); print(a) 并解释结果
- 用 is 与 == 比较两个内容相同的列表并说明差异
- 故意制造一次对象共享 bug 并说明如何避免
基础与对象
基本类型与运算符语义
【知识点】int 任意精度、float 双精度、bool 是 int 子类、complex|字面量与进制写法|算术运算符含 //、**、% 与 divmod|比较运算符与链式比较|逻辑运算符 and/or/not 的短路与返回值|成员与身份运算符 in/is|位运算符|运算优先级 【与 C 的差异】/ 恒为真除法,整除必须 //|无 ++/--,用 += 1|&&/|| 写作 and/or,! 写作 not|整数不溢出、不需要 long long|三目 a?b:c 写作 b if a else c|没有 switch 的隐式穿透问题(改 match) 【提示词】你是 Python 3.12 导师,面向有 C 语言基础的学习者。系统讲解「基本类型与运算符语义」:① 逐条列运算符与其语义;② 每条给可运行示例与预期输出;③ 重点对照 C:/ 与 //、++/--、&&/||/!、整数溢出与任意精度、位运算差异;④ 指出 3–5 个迁移陷阱;⑤ 给 5 道自测题与答案,附 docs.python.org 的表达式与数据类型章节链接。不确定处明说。
建议预留 60 分钟
学习目标
- 能正确区分 / 与 //、% 与 divmod
- 能写出链式比较与短路表达式
- 能解释整数为何不溢出
关键概念
- 任意精度整数
- 真除法与整除
- and/or 短路
- 链式比较
- 位运算
为什么学习
- 运算符语义差异会造成静默错误,尤其 / 与 //。
如何检验理解
- 写出 5 个 C 与 Python 结果不同的表达式并解释
- 用 divmod 重写一段 C 风格的取余取整代码
控制流
控制流与真值判断
【知识点】if/elif/else 与缩进块|for 与 range(start,stop,step)|while|break/continue/pass|for-else 与 while-else 的搜索失败语义|Truth Value:False/0/0.0/''/[]/{}/set()/None 均为假|条件表达式 b if a else c|match-case 结构化匹配(3.10+) 【与 C 的差异】没有 do-while|花括号与分号换成缩进与换行|for 是迭代任意可迭代对象,不是计数器循环|while-else / for-else 是 C 没有的语义|真值判断范围不同(空容器也算假)|switch/case 换成 match/case 或字典分派|循环变量在循环结束后仍存在 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「控制流与真值判断」:① 列出所有语法形式与其语义;② 每条给可运行代码与输出;③ 显式对照 C:do-while 缺失、缩进块、for 的迭代语义、switch→match、真值判断差异、循环变量作用域;④ 举 3–5 个 C 程序员易错例;⑤ 5 道自测题与答案,附 docs.python.org 控制流工具章节链接。
建议预留 75 分钟
学习目标
- 能列出所有为假的值
- 能用 for-else 表达搜索失败
- 能用 match 或字典分派替代 switch
关键概念
- if/elif/else
- for/while/range
- break/continue/pass
- Truth Value
- match-case
为什么学习
- 真值规则直接决定分支是否写对。
如何检验理解
- 把一段 C 的 switch 改写成字典分派与 match 两版
- 指出一个把空列表当真的 bug 并修复
容器
list:动态数组与常用操作
【知识点】创建与索引|增删改:append/extend/insert/pop/remove/clear|查找与计数:index/count/in|排序:sort 与 sorted、key 参数、reverse|切片读写|列表拼接与重复|嵌套列表|复杂度直觉:尾部追加摊销 O(1)、头部插入 O(n) 【与 C 的差异】C 手写数组加长度变量、扩容要 realloc,Python list 自动扩容|C 没有内置排序以外的容器方法|sort 原地排序返回 None(不是新列表)|负索引与切片是 C 没有的 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「list 动态数组」:① 列出全部常用方法与语义;② 每条给可运行示例与预期输出;③ 对照 C:手写数组与 realloc、长度管理、扩容策略、为什么头部插入是 O(n);④ 给出常见误用(把 sort 的返回值当新列表);⑤ 5 道自测题与答案,附 docs.python.org 数据结构章节链接。
建议预留 90 分钟
学习目标
- 能说出主要操作的复杂度
- 能用 list 实现栈并说明为何不做队列
- 能解释摊销 O(1)
关键概念
- 动态数组
- 摊销复杂度
- append/pop
- sort 的 key
- 切片赋值
为什么学习
- 最常用容器;理解数组本质才能在性能处选对结构。
如何检验理解
- 用 list 实现栈与队列,指出队列为何 O(n) 并给替代
- 用 sort(key=...) 按第二字段排序
容器
tuple、解包与不可变性
【知识点】tuple 创建与单元素逗号陷阱|不可变但可含可变元素|解包与星号解包|与 list 互换|namedtuple|作为 dict 键(可哈希)|多返回值本质是 tuple 【与 C 的差异】C 返回多个值要靠结构体或输出参数,Python 用 tuple 直接返回并解包|C 的结构体可改,tuple 本身不可改|C 无内置不可变序列概念(const 是编译期约束) 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「tuple、解包与不可变性」:① 列出语法与语义细节;② 每条给可运行代码与输出;③ 对照 C 的多返回值写法(结构体/输出参数)与 const;④ 讲清单元素 tuple 与 (1) 的陷阱;⑤ 5 道自测题与答案,附 docs.python.org 元组与序列类型链接。
建议预留 75 分钟
学习目标
- 能正确写单元素 tuple
- 能用星号解包处理变长序列
- 能解释 tuple 可作键而 list 不能
关键概念
- tuple 不可变
- 解包与星号解包
- namedtuple
- 可哈希性
为什么学习
- 解包是惯用法基础,也是不可变对象的第一个实例。
如何检验理解
- 用解包实现变量交换与函数多返回值
- 解释为什么 list 不能当 dict 键
容器
dict:哈希表与常用操作
【知识点】键值对与创建方式|取值:[] 与 get、setdefault|增改删:update/pop/popitem/del|遍历:keys/values/items|插入顺序保证|键必须可哈希|dict 推导式|复杂度:平均 O(1) 【与 C 的差异】C 要手写哈希表(哈希函数、拉链、扩容)或引第三方库,Python dict 是内置优化实现|C 的哈希表不保证遍历顺序,Python 保证插入顺序|缺失键的行为:C 返回垃圾值或崩溃,Python 抛 KeyError(用 get 可给默认值) 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「dict 哈希表与常用操作」:① 列全部常用方法与语义;② 每条给可运行代码与输出;③ 对照 C 手写哈希表的实现(哈希函数、冲突处理、扩容、负载因子);④ 讲键的可哈希条件与常见报错;⑤ 5 道自测题与答案,附 docs.python.org 映射类型链接。
建议预留 90 分钟
学习目标
- 能用 get/setdefault 避免 KeyError
- 能解释键为何必须可哈希
- 能用 dict 计数与分组
关键概念
- 哈希表
- 可哈希性
- get/setdefault
- 插入顺序
- dict 推导式
为什么学习
- 数据建模核心结构,也是理解哈希语义的入口。
如何检验理解
- 用 dict 统计词频并按值排序
- 解释用 list 当键的报错并给两种修复
容器
set 与 collections 工具箱
【知识点】set 创建与去重|集合运算:并/交/差/对称差及运算符形式|成员判断 O(1)|frozenset|collections:deque、Counter、defaultdict、OrderedDict、namedtuple 【与 C 的差异】C 没有内置集合与双端队列,都要自己实现或引库|Python 集合运算是一等语法|deque 两端操作 O(1),list 头部操作 O(n) 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「set 与 collections 工具箱」:① 列出各容器的方法与适用场景;② 每条给可运行代码与输出;③ 对照 C 需自行实现集合/队列的差异;④ 讲 deque 与 list 的复杂度差异及 BFS 队列选择;⑤ 5 道自测题与答案,附 docs.python.org collections 链接。
建议预留 75 分钟
学习目标
- 能用 set 运算替代多重循环去重
- 能用 Counter/defaultdict 简化计数分组
- 能说明 deque 的复杂度优势
关键概念
- 集合运算
- frozenset
- Counter
- defaultdict
- deque
为什么学习
- 这些工具能让手写逻辑一行化,是代码质量差异的主要来源。
如何检验理解
- 把双重循环去重改写为集合运算
- 用 deque 实现 BFS 并对比 list.pop(0)
索引与迭代
索引、切片与步进
【知识点】正负索引|切片 [start:stop:step] 的左闭右开与省略规则|负步长反转|越界自动截断|切片是浅拷贝|切片赋值与删除|对 str/list/tuple 通用 【与 C 的差异】C 的 arr[i] 是地址偏移且越界是未定义行为,Python 越界读抛 IndexError、切片越界自动截断|C 取子数组要手写循环 memcpy,Python 一行切片|C 改数组元素即改原内存,Python 切片结果改的是副本(嵌套元素例外) 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「索引、切片与步进」:① 列出全部切片形式与边界规则;② 每条给可运行代码与输出;③ 对照 C 的地址偏移与越界未定义行为;④ 重点讲浅拷贝陷阱与嵌套列表例外;⑤ 5 道自测题与答案,附 docs.python.org 序列类型链接。
建议预留 90 分钟
学习目标
- 能写出反转、隔项、去首尾的切片
- 能解释切片为何不 IndexError
- 能说明切片赋值与普通赋值的区别
关键概念
- 负索引
- start:stop:step
- 越界截断
- 浅拷贝
- 切片赋值
为什么学习
- 最常用语法之一,也是浅拷贝陷阱入口。
如何检验理解
- 用一行切片实现字符串反转与回文判断
- 演示改切片不影响原列表,再演示嵌套列表例外
索引与迭代
迭代协议:iter/next 与 enumerate/zip
【知识点】可迭代对象 vs 迭代器|iter()/next()/StopIteration|for 的底层展开|enumerate 的 start|zip 的惰性与最短截断|zip(*matrix) 转置|reversed/sorted|迭代器只能遍历一次 【与 C 的差异】C 的 for 是计数器循环,Python 的 for 是迭代协议、可迭代任何对象|C 遍历容器要下标或指针,Python 靠 __iter__/__next__|Python 迭代器状态ful、耗尽即空 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「迭代协议」:① 用协议术语解释 for 的展开过程;② 每条给可运行代码与输出;③ 对照 C 的计数器循环与指针遍历;④ 讲迭代器耗尽、zip 截断、惰性求值三个易错点;⑤ 5 道自测题与答案,附 docs.python.org 迭代器类型链接。
建议预留 90 分钟
学习目标
- 能手写满足迭代协议的对象
- 能解释 for 在底层调用了什么
- 能说明 zip 的惰性与截断
关键概念
- iterable vs iterator
- iter/next/StopIteration
- enumerate
- zip
- reversed/sorted
为什么学习
- 生成器、推导式、文件遍历、DataLoader 的共同底层。
如何检验理解
- 手写一个可迭代的 Range 类并用 for 遍历
- 把 for x in obj 展开成等价的 next() 循环
函数
函数定义、参数机制与默认值陷阱
【知识点】def/return 与隐式返回 None|位置参数与关键字参数|默认参数在定义时求值一次(可变默认值陷阱)|keyword-only(*)与 positional-only(/)|参数传递即对象引用|多返回值与解包接收 【与 C 的差异】C 参数按值传递、数组退化为指针,Python 传对象引用|C 没有关键字参数与默认参数|C 没有可变默认值的陷阱(默认值是每次调用求值的常量)|C 函数只返回一个值 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「函数参数机制」:① 列出所有参数形式与规则;② 每条给可运行代码与预期输出;③ 重点讲可变默认值陷阱的成因、复现与两种修复;④ 对照 C 的按值传递与指针传参;⑤ 5 道自测题与答案,附 docs.python.org 函数定义链接。
建议预留 90 分钟
学习目标
- 能解释默认参数为何只求值一次
- 能写 keyword-only 参数
- 能修复可变默认值导致的串数据 bug
关键概念
- 默认参数求值时机
- 可变默认值陷阱
- keyword-only
- positional-only
- 对象引用传参
为什么学习
- 默认值陷阱是真实 bug 高发源,参数机制决定 API 质量。
如何检验理解
- 复现并修复 def f(x, lst=[]) 的串数据 bug
- 写出强制关键字调用的签名并说明理由
字符串与正则
字符串处理与格式化
【知识点】不可变性与索引切片|split/join/strip/lstrip/rstrip|replace/find/index/startswith/endswith|大小写转换|f-string 的表达式插值、对齐、精度、调试 = 语法|str.format 与 % 格式化|编码与 bytes/str 转换|原始字符串 【与 C 的差异】C 的 char[] 可变且以 \0 结尾、需 strlen,Python str 不可变且自带长度|C 拼接字符串要 strcat 并管理缓冲区,Python 优先 join|C 的 printf 格式化对应 f-string|Python 有 str/bytes 两种类型,C 只有 char 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「字符串处理与格式化」:① 列出全部常用方法与格式化语法;② 每条给可运行代码与输出;③ 对照 C 的 char[]、strlen/strcpy/strcat、printf 格式化;④ 讲 + 拼接的性能问题与 join 的好处、编码陷阱;⑤ 5 道自测题与答案,附 docs.python.org 字符串方法链接。
建议预留 90 分钟
学习目标
- 能说明 + 拼接为何慢并给替代
- 能用 f-string 做对齐与精度格式化
- 能完成常见清洗切分任务
关键概念
- 不可变性
- join vs +
- split/strip/replace
- f-string
- 编码与 bytes
为什么学习
- 文本处理是数据清洗与日志解析的日常。
如何检验理解
- 把一段日志解析成结构化记录
- 对比 + 与 join 在 10 万次循环下的耗时
索引与迭代
推导式:list/dict/set/生成器
【知识点】list 推导式语法|条件过滤 if|嵌套推导的求值顺序|dict 与 set 推导式|生成器表达式与惰性、内存优势|推导式作用域(3.x 不泄漏变量)|与 map/filter 的取舍 【与 C 的差异】C 建数组要显式循环加 malloc,Python 推导式是表达式级构造语法|生成器表达式不占内存,对应 C 里手写增量生成器 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「四种推导式」:① 语法与求值顺序;② 每条给可运行代码与输出;③ 对照 C 的循环加动态分配写法;④ 讲生成器表达式与列表推导式的内存差异、何时该用哪种;⑤ 5 道自测题与答案,附 docs.python.org 推导式链接。
建议预留 105 分钟
学习目标
- 能为需求选择合适推导式形式
- 能说明生成器表达式的内存优势
- 能把嵌套循环改写为嵌套推导
关键概念
- list/dict/set 推导
- 生成器表达式
- 条件过滤
- 嵌套推导
- 作用域
为什么学习
- 代码密度与可读性的分水岭。
如何检验理解
- 把三层循环改写为一行推导式且保持可读
- 用生成器表达式处理大文件并说明内存优势
函数
*args/**kwargs、高阶函数与 lambda
【知识点】*args 收集位置参数、**kwargs 收集关键字参数|调用时展开 * 与 **|函数是一等对象(可赋值、传参、返回)|lambda 的表达式限制|map/filter/reduce 与推导式取舍|functools.partial 【与 C 的差异】C 可变参数用 va_list 且无类型安全,Python 用 *args/**kwargs|C 的函数指针只指函数,Python 函数是对象可带属性|C 无闭包与 lambda 的等价物 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「可变参数与高阶函数」:① 语法与收集/展开规则;② 每条给可运行代码与输出;③ 对照 C 的 va_list 与函数指针;④ 讲 lambda 的边界与何时该用 def;⑤ 5 道自测题与答案,附 docs.python.org 函数式编程链接。
建议预留 90 分钟
学习目标
- 能用 *args/**kwargs 写转发包装
- 能说明 lambda 相比 def 的限制
- 能判断何时用推导式而非 map
关键概念
- *args/**kwargs
- 参数展开调用
- 一等对象
- lambda 限制
- partial
为什么学习
- 装饰器与框架源码阅读的直接前置。
如何检验理解
- 写一个记录并转发参数的包装函数
- 把 map+lambda 改写成推导式并对比可读性
字符串与正则
正则表达式与 re 模块
【知识点】元字符与字符类|量词与贪婪/非贪婪|分组、命名分组与非捕获组|re.match/search/fullmatch/findall/finditer/sub/split|预编译 re.compile|常用模式:邮箱、日期、日志行|flags 与多行模式 【与 C 的差异】C 标准库无正则,需 POSIX regex 或 PCRE 等第三方库,Python 内置 re|C 要手动管理匹配数组与偏移,Python 返回 Match 对象 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「正则表达式与 re」:① 语法速查表加函数语义;② 每条给可运行代码与匹配结果;③ 对照 C 的 POSIX regex 库用法;④ 讲贪婪陷阱、预编译性能、命名分组可维护性;⑤ 5 道自测题与答案,附 docs.python.org re 链接。
建议预留 105 分钟
学习目标
- 能用命名分组写可维护正则
- 能说明贪婪与非贪婪的差别
- 能解释预编译的性能影响
关键概念
- 元字符与字符类
- 命名分组
- 贪婪/非贪婪
- re.sub 回调
- 预编译
为什么学习
- 日志解析、数据清洗与文本抽取的高频工具。
如何检验理解
- 从非结构化日志抽出时间戳、级别、消息三字段
- 写一个用 re.sub 加函数做条件替换的例子
文件与异常
文件读写与路径操作
【知识点】open 模式 r/w/a/b/+ 与 encoding|read/readline/readlines/迭代文件对象|write/writelines|with 自动关闭|文本与二进制模式|pathlib 的 Path、路径拼接、exists/glob/mkdir|os.path 对照|大文件流式处理 【与 C 的差异】C 用 FILE* 且必须显式 fclose,Python 用 with 保证关闭|C 路径是字符串拼接,Python 用 pathlib 跨平台对象|C 读写要指定缓冲区,Python 有默认缓冲与编码层 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「文件读写与路径操作」:① 模式、方法与编码语义;② 每条给可运行代码与输出;③ 对照 C 的 fopen/fread/fwrite/fclose 与字符串路径;④ 讲编码错误、忘记关闭、大文件一次性读入三个坑;⑤ 5 道自测题与答案,附 docs.python.org 文件读写与 pathlib 链接。
建议预留 90 分钟
学习目标
- 能正确指定编码读写中文文本
- 能用 with 保证关闭并解释原理
- 能用 pathlib 遍历目录
关键概念
- open 模式与编码
- with
- 逐行迭代
- pathlib
- 文本 vs 二进制
为什么学习
- 数据与模型文件读写是所有后续工作的前提。
如何检验理解
- 写统计大文件词频的脚本并说明为何不整读
- 用 pathlib 递归找出目录下所有 csv
函数
LEGB 作用域与闭包
【知识点】LEGB 四级查找顺序|global 与 nonlocal|自由变量与闭包捕获|循环内创建闭包的延迟绑定陷阱|默认参数固化变量的技巧|函数对象持有所需环境 【与 C 的差异】C 是块作用域,Python 只有函数/模块/类作用域、没有块作用域|C 的 static 局部变量近似闭包状态但语法不同|Python 闭包按名字查找而非按值快照 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「作用域与闭包」:① 用 LEGB 解释名字解析;② 每条给可运行代码与输出;③ 对照 C 的块作用域与 static;④ 重点复现 for 循环闭包延迟绑定陷阱并给两种修复;⑤ 5 道自测题与答案,附 docs.python.org 作用域规则链接。
建议预留 105 分钟
学习目标
- 能按 LEGB 解释名字解析
- 能修复循环闭包延迟绑定
- 能正确用 nonlocal
关键概念
- LEGB
- global/nonlocal
- 闭包捕获
- 延迟绑定
- 自由变量
为什么学习
- 闭包是装饰器与回调的底层机制。
如何检验理解
- 复现循环 lambda 全返回同值的陷阱并给两种修复
- 手写计数器闭包并说明状态存活原因
函数
递归、记忆化与迭代改写
【知识点】递归结构与终止条件|调用栈与递归深度限制(默认约 1000)|sys.setrecursionlimit 的风险|递归转显式栈迭代|functools.lru_cache 记忆化与其缓存键要求 【与 C 的差异】C 递归受栈空间限制但可调线程栈,Python 有硬性递归深度限制|C 手写记忆化数组,Python 用 lru_cache 装饰器|Python 函数调用开销远大于 C 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「递归与记忆化」:① 递归三要素与改写方法;② 每条给可运行代码与输出;③ 对照 C 的栈与递归开销;④ 讲 Python 递归深度限制与显式栈改写;⑤ 5 道自测题与答案,附 docs.python.org functools 链接。
建议预留 90 分钟
学习目标
- 能把递归改写为显式栈迭代
- 能用 lru_cache 并解释代价
- 能说出递归深度限制与规避
关键概念
- 递归终止条件
- 递归深度限制
- 显式栈
- lru_cache
为什么学习
- 你有数据结构基础,重点把 C 的递归直觉迁移到 Python 的限制。
如何检验理解
- 用显式栈重写二叉树 DFS 并对比递归版
- 用 lru_cache 优化重复子问题并测速
文件与异常
异常体系与自定义异常
【知识点】异常层次(BaseException→Exception→具体异常)|try/except/else/finally 的执行顺序|多个 except 与元组捕获|raise 与 raise from 异常链|自定义异常设计|EAFP 与 LBYL|assert 的定位 【与 C 的差异】C 用返回码与 errno 报错,Python 用异常作为控制流|C 的错误处理容易漏检,Python 异常不处理会终止并打印栈|Python 有 finally 与 with 保证清理,C 用 goto cleanup 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「异常体系」:① 层次结构与语法;② 每条给可运行代码与输出;③ 对照 C 的返回码、errno、goto cleanup;④ 讲裸 except 的危害、异常链、EAFP 思维转变;⑤ 5 道自测题与答案,附 docs.python.org 错误与异常链接。
建议预留 90 分钟
学习目标
- 能按层次设计捕获粒度而非裸 except
- 能设计自定义异常并附带上下文
- 能说明 EAFP 与 LBYL 取舍
关键概念
- 异常层次
- try/except/else/finally
- raise from
- 自定义异常
- EAFP vs LBYL
为什么学习
- 异常策略决定程序可诊断性,也是与 C 报错心智的主要分歧点。
如何检验理解
- 为一个模块设计三级异常并说明捕获位置
- 把返回错误码的 C 风格函数改写成抛异常并保留原因链
文件与异常
数据交换:JSON 与 CSV
【知识点】json.load/loads/dump/dumps|ensure_ascii 与中文|indent 与序列化格式|json 与 dict/list 的映射限制(无 tuple/自定义对象)|csv.reader/DictReader/DictWriter|分隔符与引号规则|流式读写大表|pickle 的安全风险 【与 C 的差异】C 解析 JSON 需引 cJSON 等库并手工遍历,Python 直接映射到 dict/list|C 解析 CSV 要自己处理引号转义,Python 有 csv 模块|C 无内置序列化协议,Python 有 json/pickle 但 pickle 不可用于不可信数据 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「JSON 与 CSV 处理」:① 模块 API 与映射规则;② 每条给可运行代码与输出;③ 对照 C 的 cJSON 与手写 CSV 解析;④ 讲中文转义、大文件流式、pickle 安全三个要点;⑤ 5 道自测题与答案,附 docs.python.org json 与 csv 链接。
建议预留 75 分钟
学习目标
- 能正确读写含中文的 JSON
- 能用 csv 模块流式处理大表
- 能说明 json 与 pickle 的安全差异
关键概念
- json 与 dict 互转
- ensure_ascii
- csv reader/writer
- 流式读写
- pickle 风险
为什么学习
- 与外部系统和数据集交互的日常通道。
如何检验理解
- 写一个把 CSV 转成嵌套 JSON 且保留中文的脚本
- 说明为什么不能对不可信来源用 pickle.loads
文件与异常
上下文管理器与 with 协议
【知识点】with 语法与嵌套|__enter__/__exit__ 协议|__exit__ 的返回值与异常抑制|contextlib.contextmanager 装饰生成器|contextlib.suppress/ExitStack|常见用途:文件、锁、事务、计时 【与 C 的差异】C 靠成对调用或 goto cleanup 保证释放,Python 用 with 表达进入-退出契约|C 无 RAII,Python 的 with 是资源管理的标准写法 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「上下文管理器」:① 协议与语法;② 手写类版与生成器版各给可运行代码;③ 对照 C 的 goto cleanup 与资源成对释放;④ 讲 __exit__ 返回 True 吞掉异常的后果;⑤ 5 道自测题与答案,附 docs.python.org contextlib 链接。
建议预留 90 分钟
学习目标
- 能手写 with 协议类
- 能用 contextmanager 改造生成器
- 能解释异常抑制的后果
关键概念
- __enter__/__exit__
- contextmanager
- 异常抑制
- ExitStack
为什么学习
- 统一资源管理方式,也是装饰器知识的第一个实战出口。
如何检验理解
- 实现计时上下文管理器
- 实现失败时回滚状态的上下文管理器
高级特性
装饰器机制与装饰器工厂
【知识点】装饰器语法与等价展开|用 *args/**kwargs 写通用包装|functools.wraps 保留元信息|带参数的装饰器工厂(三层嵌套)|类装饰器|多个装饰器的叠加顺序|functools.lru_cache/cached_property 作为内置装饰器实例 【与 C 的差异】C 没有装饰器,等价物是手写包装函数或宏|C 的宏在预处理期替换、无类型检查,Python 装饰器在运行期包装函数对象|Python 装饰器能访问函数元信息 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「装饰器」:① 从函数是一等对象推导出装饰器;② 逐步给出计时装饰器、带参装饰器、类装饰器三份可运行代码;③ 对照 C 的宏与手写包装;④ 讲忘记 wraps 的后果与叠加顺序;⑤ 5 道自测题与答案,附 docs.python.org 装饰器与 functools 链接。
建议预留 120 分钟
学习目标
- 能写出带参数的装饰器工厂
- 能解释闭包在装饰器中的作用
- 能说明 wraps 的必要性
关键概念
- 装饰器展开
- 装饰器工厂
- functools.wraps
- 类装饰器
- 叠加顺序
为什么学习
- 原清单只标了「读懂」,但 FastAPI/框架源码阅读都依赖它,故升为独立节点。
如何检验理解
- 实现一个可配置的计时装饰器工厂
- 演示去掉 wraps 后函数 __name__ 与文档丢失
高级特性
生成器与 yield
【知识点】yield 与暂停恢复语义|生成器函数与生成器对象|send/throw/close|yield from 委托|惰性求值与内存优势|生成器实现无限序列与流水线|与迭代器的关系 【与 C 的差异】C 没有语言级协程生成器(要手写状态机或线程),Python 的 yield 天然保留执行状态|C 生成序列通常一次性分配数组,Python 可惰性逐项产出 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「生成器与 yield」:① 从迭代协议引出生成器;② 每条给可运行代码与输出;③ 对照 C 手写状态机或一次性数组;④ 讲 send/throw 进阶、yield from、流水线组合;⑤ 5 道自测题与答案,附 docs.python.org 生成器链接。
建议预留 105 分钟
学习目标
- 能写生成器函数并解释暂停恢复
- 能用 yield from 委托子生成器
- 能对比生成器与列表的内存
关键概念
- yield 语义
- 生成器对象
- send/throw
- yield from
- 惰性求值
为什么学习
- 惰性数据流水线与 DataLoader 的共同基础。
如何检验理解
- 用生成器实现一个无限斐波那契序列并取前 10 项
- 把两段处理逻辑用生成器串成流水线并说明内存收益
高级特性
标准库工具箱:itertools / functools / pathlib / datetime
【知识点】itertools:count/cycle/chain/groupby/combinations/permutations/product/islice|functools:partial/reduce/lru_cache/cached_property/singledispatch|pathlib 常用操作|datetime 与 timezone、strftime/strptime、timedelta|标准库检索方法 【与 C 的差异】这些功能在 C 里通常要自己实现或引第三方库(如组合生成、时间格式化)|Python 标准库自带并跨平台 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「itertools / functools / pathlib / datetime」:① 按模块分组列出最常用成员与语义;② 每条给可运行代码与输出;③ 对照 C 需自行实现的部分;④ 给三个真实使用场景(组合枚举、缓存、时间区间);⑤ 5 道自测题与答案,附 docs.python.org 各模块链接。
建议预留 90 分钟
学习目标
- 能用 itertools 替代手写组合枚举
- 能用 functools 做缓存与偏函数
- 能用 datetime 处理时间区间
关键概念
- itertools 组合生成
- functools.partial/reduce
- pathlib 操作
- datetime 与 timedelta
为什么学习
- 原清单完全缺失这四个模块,但它们是数据与工程代码的日常工具。
如何检验理解
- 用 itertools 生成所有两两组合并统计数量
- 用 datetime 计算两个日期之间的工作日数
面向对象
类、实例与属性模型
【知识点】class 定义与实例化|__init__ 与 self 的显式传入|实例属性 vs 类属性(可变类属性陷阱)|实例方法/类方法/静态方法|property 与 getter/setter|私有约定 _ 与 __|__dict__ 与属性查找顺序 【与 C 的差异】C 的 struct 只有数据、方法在外部函数,Python 把数据与方法绑在类里|C 的方法调用不隐式传对象,Python 的 self 是显式第一参数|C 无继承与访问控制,Python 有继承与命名约定 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「类与属性模型」:① 从 C 的结构体加函数引出类;② 每条给可运行代码与输出;③ 讲 self 的本质与可变类属性陷阱(附串数据 bug 复现);④ property 与三种方法的适用场景;⑤ 5 道自测题与答案,附 docs.python.org 类链接。
建议预留 105 分钟
学习目标
- 能解释 self 为何必须显式写出
- 能区分实例与类属性并避开陷阱
- 能用 property 与 classmethod 表达意图
关键概念
- self 本质
- 实例 vs 类属性
- property
- classmethod/staticmethod
- 属性查找
为什么学习
- self 与属性查找顺序是理解 Python OO 的关键。
如何检验理解
- 复现类属性共享导致的串数据 bug 并修复
- 用 property 实现带校验的字段
面向对象
继承、多态与 MRO
【知识点】单继承与多继承|super() 的真实含义(MRO 中下一个)|MRO 与 C3 线性化|方法解析顺序的打印与验证|多态与鸭子类型|抽象基类 ABC|混入类设计 【与 C 的差异】C 无继承,靠结构体嵌套或函数指针模拟多态|Python 的 super() 不是父类而是 MRO 下一个,多继承时行为不同|Python 多态靠鸭子类型、无需接口声明 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「继承、多态与 MRO」:① 语法与解析规则;② 每条给可运行代码与输出,含菱形继承打印 __mro__;③ 对照 C 用结构体与函数指针模拟多态;④ 讲 super() 的常见误解与鸭子类型;⑤ 5 道自测题与答案,附 docs.python.org 类继承链接。
建议预留 105 分钟
学习目标
- 能输出并解释一个 MRO
- 能说明 super() 在多继承中的含义
- 能用鸭子类型替代接口继承
关键概念
- 继承与 super()
- MRO 与 C3
- 鸭子类型
- 抽象基类
- 混入类
为什么学习
- MRO 是理解多继承与框架基类的必要知识。
如何检验理解
- 给菱形继承结构打印 __mro__ 并解释顺序
- 用鸭子类型重构依赖 isinstance 分支的代码
面向对象
魔术方法与数据模型
【知识点】__repr__ 与 __str__ 的分工|__len__/__getitem__/__setitem__/__contains__|__iter__/__next__|__call__|__eq__ 与 __hash__ 的联动|运算符重载 __add__ 等|__enter__/__exit__|dataclass 自动生成这些方法 【与 C 的差异】C 的运算符重载要写具名函数(如 matrix_add),Python 通过 dunder 让对象直接支持 len()、for、[]、() 调用|C 无对象字符串表示约定,Python 有 repr/str 协议 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「魔术方法与数据模型」:① 按用途分类列出常用 dunder;② 每条给可运行代码与输出;③ 对照 C 的具名函数实现;④ 讲重写 __eq__ 后必须考虑 __hash__ 的后果;⑤ 5 道自测题与答案,附 docs.python.org 数据模型链接。
建议预留 120 分钟
学习目标
- 能实现支持 len/索引/迭代/调用的自定义类
- 能说明 repr 与 str 的分工
- 能解释 eq 与 hash 的联动
关键概念
- __repr__/__str__
- __len__/__getitem__
- __iter__/__next__
- __call__
- __eq__ 与 __hash__
为什么学习
- 自定义对象接入 Python 语法的接口,也是 nn.Module 可用的原因。
如何检验理解
- 实现一个可迭代、可索引、可调用的容器类
- 演示重写 __eq__ 后对象在 set 中失效并修复
模块与内存
模块、包与 import 机制
【知识点】import 与 from-import 的差别|模块搜索路径 sys.path|包与 __init__.py|绝对导入与相对导入|__name__ == '__main__' 的作用|循环导入的成因与解法|模块缓存 sys.modules|importlib 动态导入 【与 C 的差异】C 的 #include 是文本粘贴加头文件声明,Python 的 import 是运行期执行模块对象并缓存|C 的链接期符号解析对应 Python 的运行期名字查找|C 无包命名空间概念 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「模块、包与 import」:① import 时到底发生了什么;② 每条给可运行示例(含目录结构);③ 对照 C 的 #include 与链接过程;④ 讲循环导入与相对导入失败两个常见问题及解法;⑤ 5 道自测题与答案,附 docs.python.org 模块与包链接。
建议预留 90 分钟
学习目标
- 能解释 import 执行与缓存
- 能设计多包结构并避免循环导入
- 能说明相对导入失败的原因
关键概念
- import 执行与缓存
- sys.path
- 包与 __init__.py
- 相对导入
- 循环导入
为什么学习
- import 机制决定项目结构是否可维护。
如何检验理解
- 搭三层包结构并演示两种合法导入
- 复现循环导入错误并给两种结构性解法
模块与内存
内存管理:引用计数与深浅拷贝
【知识点】赋值即绑定引用|引用计数机制|循环引用与垃圾回收器 gc|gc.collect 与调试|copy.copy 浅拷贝与 copy.deepcopy 深拷贝|浅拷贝对嵌套结构的失效|is 与 id 在缓存对象上的表现|内存泄漏的常见形态 【与 C 的差异】C 手动 malloc/free 且忘记释放即泄漏,Python 靠引用计数加 GC 自动回收|C 的拷贝是 memcpy 字节级,Python 区分浅拷贝与深拷贝|Python 的「泄漏」多为意外持有引用而非忘记释放 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「内存管理与深浅拷贝」:① 引用计数与 GC 的工作方式;② 每条给可运行代码与输出;③ 对照 C 的 malloc/free 与 memcpy;④ 重点讲浅拷贝在嵌套结构上的失效与 deepcopy 的代价;⑤ 5 道自测题与答案,附 docs.python.org gc 与 copy 链接。
建议预留 105 分钟
学习目标
- 能解释深浅拷贝在嵌套结构上的差别
- 能说出引用计数无法回收的情形
- 能诊断改了副本却动了原数据的 bug
关键概念
- 引用计数
- 循环 GC
- 浅拷贝 vs 深拷贝
- 对象驻留
- 泄漏形态
为什么学习
- 深浅拷贝与引用共享是数据管线最隐蔽的 bug 源。
如何检验理解
- 用 copy 与 deepcopy 演示嵌套列表行为差异
- 构造循环引用并说明 gc 如何处理
面向对象
dataclass 与数据建模
【知识点】@dataclass 字段声明与类型注解|默认值与 field(default_factory=...)|frozen 不可变|eq/order/repr 开关|asdict/astuple|__post_init__ 校验|与 namedtuple、手写类的取舍|pydantic 的差异定位 【与 C 的差异】C 的 struct 加手写构造函数、比较函数与打印函数,dataclass 自动生成 __init__/__repr__/__eq__|C 无字段默认值的声明式写法|C 无运行时类型注解 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「dataclass」:① 参数与生成的方法;② 每条给可运行代码与输出;③ 对照 C 的 struct 样板代码;④ 讲 default_factory 与可变默认值的关系、frozen 的用途;⑤ 5 道自测题与答案,附 docs.python.org dataclasses 链接。
建议预留 90 分钟
学习目标
- 能用 dataclass 建模并说明生成的方法
- 能正确使用 default_factory
- 能判断何时该用 dataclass
关键概念
- dataclass 字段
- default_factory
- frozen
- asdict
- 与 namedtuple 对比
为什么学习
- 数据建模在数据科学、配置与 API 层都是日常。
如何检验理解
- 用 dataclass 建模实验配置并序列化为 JSON
- 说明 field(default_factory=list) 与 field(default=[]) 的差别
类型与工程
类型注解与静态检查
【知识点】基本注解语法与变量/函数/返回值标注|内置泛型 list[int]/dict[str,float]|Optional 与 Union 及 | 写法|Callable/Iterable/Sequence 等抽象类型|TypeVar 与 Generic|TypedDict 与 Literal|mypy/pyright 运行与常见报错|注解不被运行时强制 【与 C 的差异】C 的类型在编译期强制、错误编译不过,Python 注解只是提示、运行时不检查|C 的泛型要靠宏或 C11 _Generic,Python 用 typing 泛型|需要额外工具(mypy)才能获得类型检查收益 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「类型注解与静态检查」:① 注解语法速查;② 每条给可运行示例并说明 mypy 会报什么;③ 对照 C 的编译期类型系统与 .h 声明;④ 讲注解不参与运行时、TypedDict 与 Literal 的使用场景;⑤ 5 道自测题与答案,附 docs.python.org typing 与 mypy 文档链接。
建议预留 105 分钟
学习目标
- 能为函数与数据结构写类型注解
- 能运行 mypy 并修复报错
- 能解释注解与 C 编译期类型的本质差别
关键概念
- 注解语法
- 内置泛型
- Optional/Union
- TypeVar/Generic
- TypedDict/Literal
- mypy
为什么学习
- 原清单只有一行 typing,缺 mypy 与泛型;类型注解是工程化的核心入口。
如何检验理解
- 给一个模块补全类型注解并让 mypy 通过
- 写一个 mypy 能抓到但运行时抓不到的类型错误
类型与工程
虚拟环境、依赖与项目结构
【知识点】解释器与 CPython|venv 创建与激活|pip install/requirements.txt|uv 与 pyproject.toml(现代主流)|依赖锁定与版本约束|src 布局与包组织|环境变量与 .env|__main__.py 【与 C 的差异】C 用系统包管理器与 Makefile/CMake 管理依赖与构建,Python 用虚拟环境隔离加依赖清单|C 编译产物与源码分离,Python 直接分发源码或 wheel|C 的头文件搜索路径对应 Python 的 sys.path 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「虚拟环境、依赖与项目结构」:① 从零创建一个项目并安装依赖的完整命令序列;② 解释为什么必须有虚拟环境;③ 对照 C 的 Makefile/CMake 与系统依赖;④ 讲 requirements.txt 与 pyproject.toml 的取舍、uv 的定位;⑤ 5 道自测题与答案,附 packaging 与 uv 官方文档链接。
建议预留 90 分钟
学习目标
- 能用 uv 初始化项目并安装依赖
- 能解释虚拟环境的必要性
- 能组织多包项目结构
关键概念
- venv
- pip
- uv
- pyproject.toml
- 依赖锁定
- src 布局
为什么学习
- 原清单有 venv/pip/conda 但缺 uv 与 pyproject,对 2026 年的深度学习环境偏旧。
如何检验理解
- 用 uv 初始化新项目并安装两个依赖
- 说明虚拟环境隔离解决了什么问题
类型与工程
工程化:日志、代码风格与打包
【知识点】logging 的 logger/handler/formatter/level 体系|logging 与 print 的差别|配置文件与结构化日志|代码风格:PEP 8、ruff/black 格式化与检查|pre-commit 钩子|打包与发布(build、wheel、PyPI)|异常与日志的分工 【与 C 的差异】C 通常用 printf 或第三方日志库,Python 标准库自带分级 logging|C 无统一的风格工具链,Python 有 ruff/black 共识|C 编译分发二进制,Python 分发 wheel 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「日志、风格与打包」:① logging 四个组件与配置方式;② 给可运行代码(含文件与控制台双 handler);③ 对照 C 的 printf 与日志库;④ 讲 ruff/black/pre-commit 的落地方式与打包发布流程;⑤ 5 道自测题与答案,附 docs.python.org logging 与 packaging 链接。
建议预留 105 分钟
学习目标
- 能配置分级日志并输出到文件
- 能解释 logging 与 print 的生产差异
- 能用 ruff/black 统一风格
关键概念
- logging 体系
- handler/formatter
- PEP 8
- ruff/black
- pre-commit
- 打包发布
为什么学习
- 原清单完全缺失 logging、风格工具与打包,是工程侧最大的断点。
如何检验理解
- 为一个模块接入 logging 并演示分级输出
- 用 ruff 修复一个含风格问题的文件
测试与并发
测试:pytest 与测试设计
【知识点】测试的意义与金字塔(单元/集成/端到端)|pytest 断言与测试发现规则|fixture 的作用域与复用|参数化 parametrize|异常断言 pytest.raises|临时文件与 monkeypatch|mock 与打桩|覆盖率 coverage 【与 C 的差异】C 常用 assert 或第三方框架(Unity/CMocka),Python 有成熟的 pytest 生态|Python 的动态性让 monkeypatch 打桩更容易,也让类型错误更难在编译期发现|C 的测试要编译链接,Python 直接运行 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「pytest 与测试设计」:① 从零写第一个测试并运行;② 覆盖 fixture、参数化、异常断言、mock 各给可运行代码;③ 对照 C 的 assert 与测试框架;④ 讲什么样的函数最难测以及如何重构;⑤ 5 道自测题与答案,附 pytest 官方文档链接。
建议预留 105 分钟
学习目标
- 能为一个模块写单元测试
- 能用 fixture 与参数化减少重复
- 能用 mock 隔离外部依赖
关键概念
- pytest 基础
- fixture
- parametrize
- pytest.raises
- monkeypatch/mock
- 覆盖率
为什么学习
- 原清单完全没有测试,是「独立实现」验收标准的必要条件。
如何检验理解
- 为一个数据处理函数写出含边界与异常用例的测试集
- 用 mock 隔离一次网络调用并说明理由
测试与并发
并发:GIL、线程、进程与 asyncio
【知识点】GIL 的含义与影响|threading 与锁、竞态|multiprocessing 与进程池|concurrent.futures 统一接口|asyncio 事件循环、async/await、Task|asyncio.gather 与信号量限流|CPU 密集 vs IO 密集的选型判据|同步阻塞代码在事件循环里的危害 【与 C 的差异】C 用 pthread 与真并行,Python 受 GIL 限制、线程不能并行跑 CPU 密集代码(3.13 起有自由线程构建)|C 的异步要自己写事件循环或用 libuv,Python 有语言级 async/await|C 的线程创建成本低,Python 线程与进程开销模型不同 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「并发模型」:① GIL 是什么、限制了什么;② threading / multiprocessing / asyncio 各给可运行对比代码;③ 对照 C 的 pthread 与真并行;④ 给出 CPU 密集与 IO 密集的选型决策表;⑤ 5 道自测题与答案,附 docs.python.org asyncio 与 concurrent.futures 链接。
建议预留 150 分钟
学习目标
- 能解释 GIL 对并发的限制
- 能写 asyncio 并发并控制并发度
- 能判断该用线程、进程还是协程
关键概念
- GIL
- threading 与锁
- multiprocessing
- asyncio 事件循环
- gather 与信号量
- 选型判据
为什么学习
- 原清单完全缺失并发;而后续 LLM API 调用与 FastAPI 全异步栈都依赖 asyncio。
如何检验理解
- 用 asyncio 加信号量并发完成 10 个 HTTP 请求并测耗时
- 解释为何在 async 函数里用同步 requests 会卡住整个服务
测试与并发
性能剖析与优化
【知识点】timeit 微基准|cProfile 与 pstats 定位热点|line_profiler 行级剖析|内存剖析 tracemalloc|算法与数据结构优先于微优化|缓存与惰性求值|用向量化替代 Python 循环的思路|C 扩展与 Cython/numba 的定位 【与 C 的差异】C 的性能直觉是「减少指令」,Python 的性能直觉是「减少解释器层循环、把工作下推到 C 实现」|C 常用 -O2 与内联,Python 靠算法与库选择|C 可直接写底层优化,Python 常需落到 NumPy 或扩展模块 【提示词】你是 Python 3.12 导师,面向有 C 基础的学习者。系统讲解「性能剖析与优化」:① 剖析工具链与使用步骤;② 给一个可运行的慢代码并用 cProfile 找出热点;③ 对照 C 的性能优化思路差异;④ 讲为什么「先剖析再优化」以及向量化的收益来源;⑤ 5 道自测题与答案,附 docs.python.org profile 与 timeit 链接。
建议预留 90 分钟
学习目标
- 能用 cProfile 找出热点
- 能说明 Python 与 C 的性能优化思路差异
- 能用向量化替代循环提速
关键概念
- timeit
- cProfile/pstats
- tracemalloc
- 向量化思路
- C 扩展定位
为什么学习
- 原清单只有引用计数与 GC,缺 GIL 与剖析;性能直觉是从脚本走向生产的分界。
如何检验理解
- 对一段慢代码做剖析并给出优化后对比数据
- 把一段循环处理改为向量化并测量加速比
数据三件套
NumPy:ndarray 与 dtype
【知识点】ndarray 与 list 的差别|创建:array/zeros/ones/empty/arange/linspace/random|属性 shape/ndim/size/dtype/itemsize|dtype 选择与内存占用|类型转换 astype|索引、切片、布尔掩码、花式索引|reshape/view/flatten/ravel|transpose/T/squeeze/expand_dims|concatenate/stack|axis 归约语义与 keepdims|Broadcasting 三条规则|向量化与 ufunc|view 与 copy 的内存共享 【与 C 的差异】C 数组是连续内存加元素类型,ndarray 正是这个模型加向量化运算|C 的多维数组要手算下标,NumPy 用 shape 与 axis|C 里筛选要手写循环,NumPy 用布尔掩码整体运算|C 的广播要手写双层循环,NumPy 自动按规则展开 【提示词】你是 Python 3.12 与 NumPy 导师,面向有 C 基础、学过数据结构的学习者。系统讲解「NumPy ndarray」:① 从 C 数组迁移的视角组织内容;② 覆盖创建、dtype、索引切片、形状变换、axis 归约、Broadcasting、向量化七个主题,每个给可运行代码与输出 shape;③ 显式对照 C 的数组与循环写法;④ 讲 view 与 copy 的陷阱、axis 的直觉误区;⑤ 5 道自测题与答案,附 numpy.org 官方文档链接。
建议预留 180 分钟
学习目标
- 能按需求选择创建函数与 dtype
- 能解释 list 与 ndarray 的内存与运算差异
- 能正确使用 axis 与 Broadcasting
关键概念
- ndarray 属性
- dtype 与内存
- 索引与布尔掩码
- 形状变换
- axis 归约
- Broadcasting
- 向量化
- view vs copy
为什么学习
- 从 Python 进入数值计算的入口,也是 PyTorch Tensor 的直接前身;axis/Broadcasting/向量化在原清单中均为最高权重。
如何检验理解
- 计算 1000x1000 数组的内存占用并与同规模 list 对比
- 给出 3 组形状组合的 Broadcast 结果并实测验证
- 把一段 O(n^2) 循环距离计算向量化并测加速比
数据三件套
Pandas:数据清洗与汇总
【知识点】Series 与 DataFrame|读写 read_csv/read_excel/to_csv|检视 head/info/describe/shape/dtypes|选取 loc 与 iloc|条件过滤与布尔索引|缺失值 isna/fillna/dropna|类型转换 astype 与 category|清洗 drop/rename/sort_values/drop_duplicates|字符串与日期列处理|分组 groupby/agg/transform|连接 merge 的连接类型与键|concat 与 pivot_table|get_dummies|apply 与向量化的取舍 【与 C 的差异】C 里表格数据是数组的结构体,改一列要遍历;Pandas 是带标签的列式结构、按列向量化|C 分组统计要自己写哈希聚合,Pandas 是 split-apply-combine 范式|C 的连接要手写双循环或哈希,Pandas 有 merge 【提示词】你是 Python 3.12 与 Pandas 导师,面向有 C 基础的学习者。系统讲解「Pandas 数据清洗与汇总」:① 按「读入→检视→清洗→变换→分组→连接」流程组织;② 每步给可运行代码与输出表;③ 对照 C 的数组结构体与手写聚合;④ 讲 loc 与 iloc 的混淆、apply 与向量化的性能差、merge 后行数变化三个要点;⑤ 5 道自测题与答案,附 pandas 官方文档链接。
建议预留 150 分钟
学习目标
- 能说清 loc 与 iloc 的选择依据
- 能完成缺失值与类型清洗
- 能按 split-apply-combine 做分组汇总
关键概念
- Series/DataFrame
- loc vs iloc
- 缺失值处理
- 类型与日期转换
- groupby/agg
- merge/concat
- pivot_table
为什么学习
- 数据探索与清洗的标准工具,也是特征工程的前置。
如何检验理解
- 把一份含脏数据的表清洗为可直接分析的表并写清洗说明
- 按条件分组输出 mean/std/count 汇总表并解释 merge 行数变化
数据三件套
Matplotlib:绘图与出图规范
【知识点】Figure 与 Axes 的层级关系|plot/scatter/bar/hist/imshow|标签、标题、图例、刻度、网格|subplots 多面板与共享轴|annotation 与箭头|颜色映射与 colorbar|rcParams 全局样式与中文字体|savefig 的 dpi/格式/透明背景|面向报告与论文的出图习惯 【与 C 的差异】C 里画图通常导出数据再调 gnuplot 或其他工具,Python 用对象层级在同一进程内描述整张图|C 的字库与渲染要另外配置,Python 通过 rcParams 代码化配置|Python 出图可完全脚本化与可复现 【提示词】你是 Python 3.12 与 Matplotlib 导师,面向有 C 基础的学习者。系统讲解「Matplotlib 绘图与出图规范」:① 先讲 Figure/Axes 心智模型;② 覆盖常用图型、多面板、标注、样式、保存五组,每组给可运行代码;③ 对照 C 的 gnuplot 工作流;④ 讲中文乱码、dpi 与矢量格式、何时用 hist 而非 bar;⑤ 5 道自测题与答案,附 matplotlib 官方文档链接。
建议预留 120 分钟
学习目标
- 能说出 Figure 与 Axes 的关系
- 能用 subplots 组织多面板图
- 能输出中文正常、可直接引用的图
关键概念
- Figure/Axes
- 常用图型
- subplots
- annotation
- rcParams 与中文字体
- savefig 参数
为什么学习
- 画图是理解数据与展示结果的基本手段,出图规范影响结果可复现性。
如何检验理解
- 用 subplots 画一幅 2x2 面板图含折线、散点、直方图、图像
- 输出一张含中文标签与标注的 300dpi PNG
数据三件套
收尾项目:从原始数据到可复现结论
【知识点】项目结构:源码、数据、脚本、配置分离|读取原始数据并记录数据来源|清洗规则显式化与可追溯|统计与可视化|结果导出与环境锁定|README 与运行说明|把探索过程固化为可重跑脚本 【与 C 的差异】C 的项目以编译产物为中心,Python 数据项目以脚本与数据为中心|C 复现靠构建环境,Python 复现还要锁定数据版本与随机种子|C 的实验结果常在代码内,Python 常落到 CSV 与图文件 【提示词】你是 Python 数据工程导师,面向有 C 基础的学习者。请给出一个「从原始 CSV 到清洗结果、统计与两张图、可复现脚本」的完整项目方案:① 目录结构与每个文件职责;② 分步骤实现代码(读取、清洗、统计、绘图、导出);③ 明确每处异常处理与日志的理由;④ 说明如何保证可复现(依赖锁定、随机种子、数据快照);⑤ 附一份 README 模板与 3 个可扩展方向。
建议预留 240 分钟
学习目标
- 能独立完成从原始数据到结论的可复现脚本
- 能为脏数据设计清洗规则并说明理由
- 能把脚本拆成模块并写清依赖
关键概念
- 项目结构
- 清洗规则设计
- 可复现性
- 结果导出
- README
为什么学习
- 验收标准是「独立实现」,需要一个真实的小型端到端任务证明基础树已打通。
如何检验理解
- 交付脚本:输入原始 csv、输出清洗表与 2 张图,附 README
- 说明脚本中每一处异常处理与日志的理由
前置关系与知识联系
- 变量绑定、动态类型与对象模型 → 基本类型与运算符语义
- 变量绑定、动态类型与对象模型 → 控制流与真值判断
- 基本类型与运算符语义 → 控制流与真值判断
- 基本类型与运算符语义 → list:动态数组与常用操作
- list:动态数组与常用操作 → tuple、解包与不可变性
- list:动态数组与常用操作 → dict:哈希表与常用操作
- dict:哈希表与常用操作 → set 与 collections 工具箱
- list:动态数组与常用操作 → 索引、切片与步进
- tuple、解包与不可变性 → 索引、切片与步进
- 索引、切片与步进 → 迭代协议:iter/next 与 enumerate/zip
- 迭代协议:iter/next 与 enumerate/zip → 推导式:list/dict/set/生成器
- 控制流与真值判断 → 函数定义、参数机制与默认值陷阱
- 函数定义、参数机制与默认值陷阱 → *args/**kwargs、高阶函数与 lambda
- *args/**kwargs、高阶函数与 lambda → LEGB 作用域与闭包
- 函数定义、参数机制与默认值陷阱 → 递归、记忆化与迭代改写
- 推导式:list/dict/set/生成器 → 字符串处理与格式化
- 字符串处理与格式化 → 正则表达式与 re 模块
- 异常体系与自定义异常 → 文件读写与路径操作
- set 与 collections 工具箱 → 异常体系与自定义异常
- *args/**kwargs、高阶函数与 lambda → 装饰器机制与装饰器工厂
- 异常体系与自定义异常 → 上下文管理器与 with 协议
- 文件读写与路径操作 → 数据交换:JSON 与 CSV
- 异常体系与自定义异常 → 数据交换:JSON 与 CSV
- LEGB 作用域与闭包 → 装饰器机制与装饰器工厂
- 迭代协议:iter/next 与 enumerate/zip → 生成器与 yield
- *args/**kwargs、高阶函数与 lambda → 标准库工具箱:itertools / functools / pathlib / datetime
- 函数定义、参数机制与默认值陷阱 → 类、实例与属性模型
- 类、实例与属性模型 → 继承、多态与 MRO
- 继承、多态与 MRO → 魔术方法与数据模型
- 魔术方法与数据模型 → dataclass 与数据建模
- 类、实例与属性模型 → dataclass 与数据建模
- 类、实例与属性模型 → 模块、包与 import 机制
- 数据交换:JSON 与 CSV → 模块、包与 import 机制
- 变量绑定、动态类型与对象模型 → 内存管理:引用计数与深浅拷贝
- list:动态数组与常用操作 → 内存管理:引用计数与深浅拷贝
- 模块、包与 import 机制 → 类型注解与静态检查
- 函数定义、参数机制与默认值陷阱 → 类型注解与静态检查
- 模块、包与 import 机制 → 虚拟环境、依赖与项目结构
- 虚拟环境、依赖与项目结构 → 工程化:日志、代码风格与打包
- 异常体系与自定义异常 → 工程化:日志、代码风格与打包
- 虚拟环境、依赖与项目结构 → 测试:pytest 与测试设计
- 异常体系与自定义异常 → 测试:pytest 与测试设计
- 生成器与 yield → 并发:GIL、线程、进程与 asyncio
- 虚拟环境、依赖与项目结构 → 并发:GIL、线程、进程与 asyncio
- 虚拟环境、依赖与项目结构 → 性能剖析与优化
- 内存管理:引用计数与深浅拷贝 → 性能剖析与优化
- 内存管理:引用计数与深浅拷贝 → NumPy:ndarray 与 dtype
- 索引、切片与步进 → NumPy:ndarray 与 dtype
- NumPy:ndarray 与 dtype → Pandas:数据清洗与汇总
- 数据交换:JSON 与 CSV → Pandas:数据清洗与汇总
- Pandas:数据清洗与汇总 → Matplotlib:绘图与出图规范
- Pandas:数据清洗与汇总 → 收尾项目:从原始数据到可复现结论
- Matplotlib:绘图与出图规范 → 收尾项目:从原始数据到可复现结论
结合互动地图查看具体关系类型,再选择下一步。