Skip to content

Python

Python 语言核心与 FastAPI 现代 Web:对象模型、GC、GIL、asyncio、Pydantic 校验、Depends 依赖注入与生产部署。

Updated View as Markdown
For humans

Python

校招考察频度:★ 高频(核心必背·高频生死线) 复习主线:Python 是本技术栈的第一主线与 AI Agent 开发底座。校招面试核心聚焦点:变量与对象模型、内存管理与垃圾回收(引用计数+标记清除+分代回收)、GIL 本质与多进程/多线程/协程选型、asyncio 事件循环底层与单线程高并发,以及 FastAPI 现代异步 Web 生产架构(ASGI 规范、Pydantic V2 契约校验、Depends 依赖注入、异步数据库连接池与生产多进程部署)。

Python 的一切都是对象,理解对象模型与底层运行时是攻克后续高并发与 AI 工程的地基;而 FastAPI 则是将 Python 异步并发与工程规范转化为生产可用 Web 服务的标准承载。


分类考频地图

一、Python 语言核心

专题核心页面校招考频星级重点考查要点
内存与垃圾回收Python 内存与 GC★ 高频(生死线)引用计数为核心、循环引用破解(标记-清除双向链表)、分代回收(0/1/2代阈值与触发)、内存池(小内存分配器 Pymalloc)
并发与 GILGIL 与并发模型★ 高频(核心必考)为什么有 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 对比

维度FastAPIFlaskDjango
异步原生 async同步为主(2.0+ 支持 async 视图)3.1+ 异步视图
类型类型驱动无无
文档OpenAPI 自动生成手动/插件手动
数据校验Pydantic 内置手动DRF 序列化器
ORM自由(SQLAlchemy)自由内置 ORM
管理后台无无内置 admin
生态年轻但活跃(AI/Agent 标准)插件多全栈全家桶

选型逻辑:

  • 新项目、API 优先、异步并发、AI/Agent 编排 → FastAPI
  • 轻量同步服务、简单工具页面 → Flask
  • 需要 admin、内置 ORM、认证全家桶、传统模板渲染 → Django

经典面试追问

  1. 变量赋值是复制吗? 不是。变量是绑定到对象的名字,赋值只绑名字,对象共享。
  2. 为什么 tuple 可以当 dict 的 key? 不可变所以可哈希。含 list 的 tuple 不可哈希(list 可变)。
  3. == 和 is 的区别? == 比值(__eq__),is 比身份(id)。判 None 用 is。
  4. 既然 Python 有 GIL,为什么异步框架(FastAPI/asyncio)还能达到极高吞吐? GIL 限制的是 CPU 密集型任务的多核真并行,而 Web 场景绝大部分属于网络/数据库 I/O 密集型。asyncio 通过 Linux epoll 多路复用和协作式协程调度,单核即可挂起数万处于等待状态的 I/O 连接,大幅消除线程上下文切换开销。
  5. FastAPI 是由什么组成的?和 Django/Flask 怎么选? FastAPI 核心由 Starlette(ASGI 协议与路由底座)+ Pydantic(Rust 加速的数据校验)+ 自身的 Depends 依赖注入与 OpenAPI 文档生成器组成。API 优先与 AI 时代首选 FastAPI,全栈自带管理后台选 Django,极简原型选 Flask。
Navigation

Type to search…

↑↓ navigate↵ selectEsc close