Python
校招考察频度:★ 高频(核心必背·高频生死线) 复习主线:Python 是本技术栈的第一主线与 AI Agent 开发底座。校招面试核心聚焦点:变量与对象模型、内存管理与垃圾回收(引用计数+标记清除+分代回收)、GIL 本质与多进程/多线程/协程选型、asyncio 事件循环底层与单线程高并发,以及 FastAPI 现代异步 Web 生产架构(ASGI 规范、Pydantic V2 契约校验、Depends 依赖注入、异步数据库连接池与生产多进程部署)。
Python 的一切都是对象,理解对象模型与底层运行时是攻克后续高并发与 AI 工程的地基;而 FastAPI 则是将 Python 异步并发与工程规范转化为生产可用 Web 服务的标准承载。
分类考频地图
一、Python 语言核心
| 专题 | 核心页面 | 校招考频星级 | 重点考查要点 |
|---|---|---|---|
| 内存与垃圾回收 | Python 内存与 GC | ★ 高频(生死线) | 引用计数为核心、循环引用破解(标记-清除双向链表)、分代回收(0/1/2代阈值与触发)、内存池(小内存分配器 Pymalloc) |
| 并发与 GIL | GIL 与并发模型 | ★ 高频(核心必考) | 为什么有 GIL(保护 C 扩展与引用计数线程安全)、CPU 密集型 vs I/O 密集型表现、绕过 GIL 的 4 种方案(多进程/C扩展/Subinterpreters/nogil) |
| 异步高并发 | 异步编程 asyncio | ★ 高频(现代核心) | 事件循环与 epoll 底层、生成器 yield 到 async/await 演进、Task/Future、gather 并发、避免阻塞调用与 to_thread 隔离 |
| 数据类型与底层 | 数据类型与内置结构 | ★ 高频(基础高频) | 可变 vs 不可变、== vs is、深浅拷贝内层共享陷阱、list 动态扩容与 dict 开放寻址 hash 表底层 |
| 函数与闭包 | 函数进阶 | ☆ 中频(核心机制) | 默认参数可变对象大坑(函数定义期绑定)、闭包底层 __closure__、装饰器原理与 @wraps 保留元信息 |
| 迭代器与生成器 | 迭代器与生成器 | ☆ 中频(数据流基石) | 可迭代对象与迭代器协议(__iter__/__next__)、生成器惰性求值与海量数据流处理、yield from 管道委托 |
| 面向对象与元编程 | 类与元编程 | ☆ 中频(进阶拓展) | MRO C3 线性化算法(菱形继承)、描述符协议(__get__/__set__)、元类 type 动态定制类创建、__slots__ 节省内存 |
| 上下文与标准库 | 上下文管理器与标准库 | 低频(标准库拓展) | with 上下文管理器协议(__enter__/__exit__)、contextlib 工具库、常用标准库模块最佳实践 |
| 类型与工程规范 | 类型注解与工程规范 | 低频(工程规范) | Typing 类型提示与 Pydantic 结合、现代工程虚拟环境管理与 PEP 8 生产代码规范 |
二、FastAPI 现代异步 Web
| 专题 | 核心页面 | 校招考频星级 | 重点考查要点 |
|---|---|---|---|
| 路由与请求 | FastAPI 路由与请求 | ★ 高频(框架核心) | APIRouter 模块化、路径参数/查询参数/请求体提取、流式响应(StreamingResponse)与 SSE 实时传输 |
| 数据校验 | FastAPI 数据校验 | ★ 高频(生死线) | BaseModel 校验、Field 限制、model_validator、属性别名与序列化性能(Pydantic V2 Rust 核心加速) |
| 依赖注入 | FastAPI 依赖注入 | ★ 高频(核心架构) | Depends 控制反转原理、有状态依赖(DB Session yield 自动关闭)、子依赖与全局依赖、解耦鉴权与上下文传递 |
| 异步并发 | FastAPI 异步并发 | ☆ 中频(大厂分水岭) | ASGI 协程事件循环、def(AnyIO 线程池执行)vs async def(直接调度)本质区别、同步阻塞 I/O 卡死全服务排查 |
| 生产部署 | FastAPI 生产部署 | ★ 高频(生产实战) | Gunicorn 进程管理器 + UvicornWorker、容器化多阶段构建、健康检查、日志与 Prometheus 监控接入 |
| 鉴权与安全 | FastAPI 鉴权与安全 | ☆ 中频(安全防护) | OAuth2PasswordBearer、JWT 验签与过期处理、安全依赖注入与角色权限控制 |
| 数据库集成 | FastAPI 数据库集成 | ☆ 中频(工程实践) | 异步驱动 asyncmy/asyncpg、SQLAlchemy 2.0 AsyncSession 生命周期与事务提交/回滚上下文 |
| 中间件与异常 | FastAPI 中间件与异常 | ☆ 中频(通用机制) | BaseHTTPMiddleware 耗时计时、CORS 跨域、全局 HTTPException 统一拦截与响应格式标准化 |
| 测试与调试 | FastAPI 测试与调试 | 低频(工程质量) | TestClient 与 AsyncClient 单元测试、异步接口 Mock 与端到端测试 |
校招面试学习路线
┌─────────────────────────────────────────────────────────────┐
│ 第一阶段:语言核心与对象模型(变量绑定、深浅拷贝、内置数据结构)│
└──────────────────────────────┬──────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 第二阶段:底层运行时与并发(引用计数+分代GC、GIL机制与绕过) │
└──────────────────────────────┬──────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 第三阶段:asyncio 异步非阻塞(事件循环、epoll底座、Task并发调度)│
└──────────────────────────────┬──────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 第四阶段:FastAPI 现代框架核心(ASGI架构、Pydantic V2、Depends)│
└──────────────────────────────┬──────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 第五阶段:工程实践与生产部署(Gunicorn+Uvicorn、连接池与监控) │
└──────────────────────────────┬──────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 第六阶段:AI Agent 落地与双栈协同(流式输出、向量检索、Java中台)│
└─────────────────────────────────────────────────────────────┘Python 对象模型要点
对象三要素
每个对象都有三个属性:id(身份)、type(类型)、value(值)。
a = [1, 2, 3]
b = a # b 和 a 指向同一个对象
a.append(4)
print(b) # [1, 2, 3, 4] b 跟着变变量是名字,不是盒子。赋值只是把名字绑定到对象上,不复制任何东西。这是 Python 和 C/Java 心智模型的核心差异。
== 与 is
| 比较 | 比什么 | 什么时候用 |
|---|---|---|
== | 值相等(调用 __eq__) | 业务比较,绝大多数场景 |
is | 身份相等(id 相同) | 与 None 比较、单例比较 |
a = [1, 2]
b = [1, 2]
a == b # True 值相同
a is b # False 不同对象坑:小整数缓存(-5 到 256)和短字符串可能复用对象,is 恰好为 True,这是实现细节,别依赖。
可变与不可变
| 类别 | 类型 | 特点 |
|---|---|---|
| 不可变 | int、float、str、tuple、frozenset | 值不能改,改了就是新对象(重新绑定) |
| 可变 | list、dict、set | 原地修改,id 不变 |
关键推论:
- 不可变对象可哈希,能当 dict 的 key、set 的元素;list/dict 不行
+=对不可变对象是重新绑定(新对象),对 list 是原地修改。a += b和a = a + b对 list 行为相同但 id 可能不同(__iadd__)- 函数默认参数用可变对象是经典坑(见函数篇)
深浅拷贝
浅拷贝共享内层, 深拷贝全部分离
- 浅拷贝
copy.copy:新对象,但内层可变对象仍共享。改内层会影响两边 - 深拷贝
copy.deepcopy:递归复制所有层,完全独立。代价是慢、可能递归爆栈 - 切片
lst[:]、list(lst)、dict.copy()都是浅拷贝 - 自定义对象可定义
__copy__/__deepcopy__控制行为
FastAPI 架构与生态定位
架构:Starlette + Pydantic
FastAPI = Starlette + Pydantic + 胶水层
- Starlette:轻量 ASGI 框架,提供路由、中间件、WebSocket、SSE 等基础能力
- Pydantic:数据模型,请求校验和响应序列化(V2 版本基于 Rust 核心全面加速)
- FastAPI 胶水层:把两者接起来,加依赖注入、OpenAPI 自动文档、类型推断
- 运行在 uvicorn(ASGI 服务器)上
与 Flask/Django 对比
| 维度 | FastAPI | Flask | Django |
|---|---|---|---|
| 异步 | 原生 async | 同步为主(2.0+ 支持 async 视图) | 3.1+ 异步视图 |
| 类型 | 类型驱动 | 无 | 无 |
| 文档 | OpenAPI 自动生成 | 手动/插件 | 手动 |
| 数据校验 | Pydantic 内置 | 手动 | DRF 序列化器 |
| ORM | 自由(SQLAlchemy) | 自由 | 内置 ORM |
| 管理后台 | 无 | 无 | 内置 admin |
| 生态 | 年轻但活跃(AI/Agent 标准) | 插件多 | 全栈全家桶 |
选型逻辑:
- 新项目、API 优先、异步并发、AI/Agent 编排 → FastAPI
- 轻量同步服务、简单工具页面 → Flask
- 需要 admin、内置 ORM、认证全家桶、传统模板渲染 → Django
经典面试追问
- 变量赋值是复制吗? 不是。变量是绑定到对象的名字,赋值只绑名字,对象共享。
- 为什么 tuple 可以当 dict 的 key? 不可变所以可哈希。含 list 的 tuple 不可哈希(list 可变)。
- == 和 is 的区别? == 比值(
__eq__),is 比身份(id)。判 None 用 is。 - 既然 Python 有 GIL,为什么异步框架(FastAPI/asyncio)还能达到极高吞吐? GIL 限制的是 CPU 密集型任务的多核真并行,而 Web 场景绝大部分属于网络/数据库 I/O 密集型。asyncio 通过 Linux epoll 多路复用和协作式协程调度,单核即可挂起数万处于等待状态的 I/O 连接,大幅消除线程上下文切换开销。
- FastAPI 是由什么组成的?和 Django/Flask 怎么选? FastAPI 核心由 Starlette(ASGI 协议与路由底座)+ Pydantic(Rust 加速的数据校验)+ 自身的
Depends依赖注入与 OpenAPI 文档生成器组成。API 优先与 AI 时代首选 FastAPI,全栈自带管理后台选 Django,极简原型选 Flask。