Python 面试题
本页只放 Python 面试标准回答、项目话术、常见追问和知识点跳转。基础语法、数据结构、函数模块、面向对象、异常文件、类型标注、并发异步、Web API、数据库、数据分析、测试和 AI 开发的原理与 Demo 放在知识点页,深度验收看 Python 从零到精通验收清单。
使用方式
mermaid
flowchart TD
A["面试页:标准回答"] --> B["知识点页:原理、流程图、Demo"]
B --> C["项目页:脚本、服务、数据处理、AI应用"]高频问题
| 面试题 | 标准回答 | 原理知识点 |
|---|---|---|
| Python 应该怎么从零学到生产级 | 不能只学语法,要按环境依赖、基础语法、数据结构、函数模块、异常文件、类型标注、日志测试、并发异步、Web API、数据库、数据处理、AI 工程这条链路学习。 | Python从零到生产级掌握、从零到精通验收清单、商业场景训练营 |
| 怎么判断 Python 是否真正学懂 | 不能只会写脚本。真正学懂要能讲清解释器和虚拟环境、对象引用、数据结构、模块化、异常资源、类型标注、GIL、asyncio、FastAPI 请求链路、数据库事务、Pandas 数据口径、测试日志和 AI/RAG 工程化。 | 从零到精通验收清单 |
| Python 适合做什么 | Python 语法简洁、生态丰富,适合脚本自动化、Web API、数据分析、爬虫、测试工具、AI 应用和运维工具。 | Python首页 |
list、tuple、dict、set 怎么选 | list 有序可变,适合列表;tuple 有序不可变,适合固定结构;dict 键值映射;set 去重和集合运算。 | 数据结构 |
| Python 函数有什么特点 | 函数是一等对象,可以赋值、传参、返回;支持默认参数、可变参数、关键字参数和闭包。 | 函数与模块 |
| 模块和包是什么 | 模块是 .py 文件,包是包含多个模块的目录。它们用于组织代码、复用能力和隔离命名空间。 | 函数与模块 |
| Python 面向对象怎么理解 | 类封装数据和行为,对象是类的实例;继承用于复用和扩展,多态让不同对象以统一接口工作。 | 面向对象 |
| 异常处理怎么写 | 用 try/except/else/finally 捕获和清理,业务异常要保留上下文,不要空 except 吞掉错误。 | 异常与文件 |
| 文件读写要注意什么 | 使用 with open(...) 自动关闭资源,明确编码,处理大文件时避免一次性读入全部内容。 | 异常与文件 |
| 类型标注有什么用 | 类型标注提升可读性、IDE 提示和静态检查能力,但运行时默认不强制类型。复杂项目建议配合 mypy/pyright。 | 类型标注 |
| GIL 是什么 | GIL 是 CPython 的全局解释器锁,使同一时刻通常只有一个线程执行 Python 字节码。IO 密集可用多线程,CPU 密集更适合多进程或原生扩展。 | 并发与异步、商业训练营:GIL |
asyncio 适合什么 | asyncio 适合大量 IO 等待场景,例如网络请求、WebSocket、异步 API。它不是让 CPU 计算变快,而是减少等待浪费。 | 并发与异步 |
| 线程池、进程池、asyncio 怎么选 | 线程池适合阻塞式 IO,例如调用接口、读文件、访问数据库;进程池适合 CPU 密集计算;asyncio 适合大量异步网络 IO,但链路里不能调用阻塞库。生产上还要限制并发、设置超时、处理异常和重试幂等。 | 并发与异步 |
| async 接口为什么会突然全变慢 | 常见原因是在 async 函数里调用了阻塞函数,例如 time.sleep、同步 requests、同步数据库驱动,导致事件循环被卡住。要改用异步库,或用 asyncio.to_thread 把阻塞逻辑放到线程池。 | 并发与异步 |
| asyncio 为什么能高并发 | asyncio 通过事件循环调度协程。协程遇到 await 等待网络 IO 时会挂起,把控制权交还给事件循环,事件循环继续运行其他协程。它不是让单个请求更快,而是复用大量 IO 等待时间,提高整体吞吐。 | 并发与异步:asyncio核心模型 |
| async 函数调用后为什么没执行 | 调用 async def 函数只会得到协程对象,不会自动运行。必须在事件循环里 await,或者包装成 Task 交给事件循环调度。否则代码看起来调用了函数,但实际没有执行函数体。 | 并发与异步:async函数为什么没执行 |
| 并发任务为什么必须限流 | 并发不是越大越好。没有限流会让下游接口、数据库连接池、模型服务、文件句柄和内存队列被瞬间打爆。生产中要用线程池大小、连接池大小、asyncio.Semaphore、队列容量和超时共同控制压力。 | 并发与异步:超时取消和背压 |
| 什么是背压 | 背压是下游处理不过来时,上游不能无限制继续提交任务,而要等待、拒绝、降级或降低并发。没有背压时,请求会在内存队列里越堆越多,最终导致 OOM、超时和雪崩。 | 并发与异步:超时取消和背压 |
| 并发任务为什么要做幂等 | 并发调用常伴随超时、重试、取消和部分失败。如果写操作没有幂等键,重试可能重复创建工单、重复发短信、重复写采集记录。商业系统要用业务唯一键或 idempotency key 保证重复请求安全。 | 并发与异步:面试标准回答 |
| Python 并发问题怎么排查 | CPU 高但吞吐低时看是否 CPU 密集却用了线程;程序卡住看线程池任务是否无超时;async 全站慢看事件循环是否被阻塞;内存上涨看任务数量、队列和结果列表是否无限增长;下游报错变多看并发、重试和连接池是否过大。 | 并发与异步:生产排查流程、日志与调试 |
| FastAPI 一次请求怎么走 | 请求先到 Uvicorn,Uvicorn 按 ASGI 规范交给 FastAPI;FastAPI 做路由匹配、参数提取、Pydantic 校验、依赖注入,执行接口函数后序列化响应并写回客户端。 | Web API开发 |
FastAPI 中 def 和 async def 怎么选 | 同步数据库驱动、同步 SDK、普通阻塞业务更适合 def;异步 HTTP、异步数据库、WebSocket、流式响应适合 async def。async def 里调用阻塞函数会卡住事件循环。 | Web API开发 |
| Python Web API 怎么分层 | 常见分层是 Router/Controller 接收请求,Service 写业务,Repository/DAO 访问数据库,Schema/DTO 处理输入输出。 | Web API开发 |
| FastAPI 返回 422 是什么 | 422 表示请求已经进入服务端,但 Path、Query、Header 或 Body 不符合函数签名和 Pydantic 模型约束。它是客户端参数不符合接口契约,不是服务端代码崩溃。 | Web API开发 |
| Python Web API 线上慢怎么定位 | 先用 request_id 和 access log 判断是全局慢还是单接口慢,再拆数据库、外部接口、AI 调用、代码计算耗时;数据库慢看 SQL、EXPLAIN、索引和锁等待,外部接口慢看超时、重试和降级。 | Web API开发 |
| Python 操作数据库要注意什么 | 使用连接池、参数化查询、防 SQL 注入、事务边界、分页和索引;不要把用户输入拼接进 SQL。 | 数据库访问 |
| Python 数据库事务怎么处理 | 一个完整业务动作中的多次写操作应放在同一事务里,全部成功才提交,任何一步失败就回滚。不要在事务里做慢网络调用或大文件处理,否则会长时间持有锁。 | 数据库访问 |
| 为什么参数绑定能防 SQL 注入 | 参数绑定把 SQL 模板和用户输入分开交给驱动,用户输入只作为值处理,不会被当作 SQL 语法执行。表名、字段名、排序字段不能参数绑定,要用白名单。 | 数据库访问 |
| 连接池为什么不能无限大 | 连接池能复用连接,但每条连接都会占用数据库资源。多 worker 部署时总连接数等于 worker 数乘以池大小,连接过多会打满数据库并增加锁竞争。 | 数据库访问 |
| SQLAlchemy Session 是什么 | Session 是一次工作单元,负责对象状态、事务、flush、commit、rollback 和连接借还。Web 项目通常每个请求一个 Session,请求结束关闭,不能全局复用。 | 数据库访问 |
| Python 中慢 SQL 怎么排查 | 先定位具体 SQL 和参数,再看耗时、扫描行数、执行计划、索引使用、排序分组、JOIN 和锁等待。不要一上来加缓存,要先找慢的真实原因。 | 数据库访问 |
| Python 项目目录怎么设计 | 常见结构是 api 处理 HTTP,schemas 处理入参出参,services 写业务规则,repositories 访问数据库,models 放实体,core 放配置、异常、日志、安全,tests 放测试。 | 项目实践 |
| 为什么配置不能写死在代码里 | 写死配置会导致密钥泄露、环境无法区分、改配置必须重新发版。生产项目应使用环境变量、配置文件或配置中心,提交 .env.example,真实 .env 不提交。 | 项目实践 |
| Python 服务上线前检查什么 | 检查依赖版本、配置注入、数据库迁移、测试、日志、异常处理、外部调用超时、健康检查、敏感信息脱敏和回滚方案。上线后观察错误率、耗时、CPU、内存和数据库连接。 | 项目实践 |
print 和 logging 有什么区别 | print 只是输出文本,适合临时调试;logging 是日志系统,支持级别、格式、Handler、异常堆栈、过滤和日志平台采集,正式项目应使用 logging。 | 日志与调试 |
| Python logging 核心组件有哪些 | 核心组件包括 Logger、Level、Handler、Formatter、Filter 和 LogRecord。业务代码调用 Logger 生成日志事件,经级别过滤后交给 Handler,再由 Formatter 输出到控制台、文件或日志平台。 | 日志与调试 |
| 为什么线上日志要有 request_id | 一次请求会经过 API、Service、Repository 和外部接口。request_id 能把同一次请求的日志串起来,排查慢接口、异常和下游失败时可以快速还原链路。 | 日志与调试 |
| Python 线上问题怎么靠日志排查 | 先确认影响范围,再用 request_id 或 task_id 检索完整链路,看异常堆栈和各阶段耗时。接口慢时拆数据库、外部接口、AI 调用和代码计算;任务失败时看批次、失败行和错误码。 | 日志与调试 |
| Pandas 适合做什么 | Pandas 适合结构化数据清洗、转换、统计、聚合和导出,例如 CSV/Excel 报表、导入前预校验、数据质量检查。生产中要关注编码、字段类型、缺失值、重复数据、业务主键、异常值、内存和口径校验。 | 数据处理 |
| Pandas 数据清洗完整流程是什么 | 我会先确认字段含义和业务口径,再读取数据并检查 shape、head、info、缺失和重复;然后转换金额、日期、状态等关键字段,按业务主键去重,处理缺失和异常,再按明确口径过滤数据,最后分组聚合、导出结果,并做总数、总金额和样例抽查校验。 | 数据处理标准流程、Pandas清洗分析 |
| NumPy 和 Pandas 有什么区别 | NumPy 核心是 ndarray,适合高效数值计算、矩阵和向量化;Pandas 核心是 Series 和 DataFrame,适合带行列标签的表格数据清洗、筛选、分组、聚合和导出。Pandas 很多底层计算依赖 NumPy,但更贴近业务表格处理。 | 数据处理、NumPy数组计算 |
| NumPy 为什么比 Python list 快 | Python list 是通用容器,里面存的是 Python 对象引用,数值计算通常要通过解释器逐个处理元素。NumPy ndarray 通常把同类型数据放在连续内存中,数组运算交给底层 C 实现批量处理,减少 Python 层循环、对象访问和类型判断开销,所以大量数值计算更快。 | NumPy数组计算:向量化为什么快 |
| NumPy 的 shape、dtype、axis 怎么理解 | shape 是数组每个维度长度,dtype 是元素类型,axis 表示沿哪个维度聚合。二维数组中 axis=0 通常压缩行方向得到每列统计,axis=1 压缩列方向得到每行统计。实际使用时要结合业务含义判断行列代表什么。 | NumPy数组计算 |
| NumPy 广播机制是什么 | 广播是在数组形状不完全相同时自动扩展较小数组的机制。从右往左比较维度,维度相等或其中一个为 1 时可以广播,否则报错。广播常用于列权重、标量折扣、批量偏移,但必须确认维度语义正确。 | NumPy数组计算:广播机制 |
| 数据清洗为什么不能直接填 0 或直接删除 | 缺失值和异常值有业务含义。金额缺失不等于金额为 0,退款负数可能合理,订单主键缺失则无法追溯。正确做法是先判断字段含义和业务口径,再决定填充、剔除、保留、标记或输出错误文件。 | 缺失值处理、异常值处理 |
| 数据报表对不上怎么排查 | 先看原始数据是否完整,再看读取行数、编码、分隔符、表头是否正确;然后查字段类型转换、缺失值、重复主键、异常值和过滤口径;最后检查 groupby 聚合逻辑、单位、时间范围,并用聚合前后总金额、样例明细和历史报表对账。 | 生产排查流程 |
| 数据处理脚本怎么设计才可靠 | 先明确输入输出、字段口径和异常规则,再拆成读取、字段校验、类型标准化、异常拆分、业务去重、聚合、导出和运行摘要。核心字段转换失败不能静默丢弃,要输出异常文件和原因;金额、状态、重复订单和时间范围这类规则要写测试。 | 数据处理端到端实践 |
| SettingWithCopyWarning 是什么 | 它表示你可能在不明确的视图或拷贝上赋值,修改结果不一定按预期生效。正确做法是过滤后显式 .copy(),或者在原 DataFrame 上使用 .loc[row_condition, column] 明确赋值。 | Pandas清洗分析:SettingWithCopyWarning |
| groupby 的原理是什么 | groupby 可以理解成拆分、应用、合并三步:先按字段把 DataFrame 拆成多个组,再对每组执行 sum、mean、count、nunique 等聚合函数,最后合并成结果表。要注意 count 统计非空值,size 统计行数。 | Pandas清洗分析:groupby |
| Pandas 大文件怎么处理 | 先用 usecols 减少读取列,用 dtype 控制类型,用 chunksize 分块读取。分块后不能忘记跨块去重、全局排序和全局 TopN 等问题。数据量继续增大时,应考虑数据库、DuckDB、Polars 或 Spark。 | Pandas清洗分析:大文件处理、端到端实践:大文件处理 |
| Python 测试怎么分层 | 常见分层是单元测试、集成测试、接口测试和端到端测试。单元测试最多,覆盖函数、类和 Service;集成测试验证数据库等组件;接口测试验证 HTTP 入参出参;端到端测试只覆盖核心流程。 | 测试 |
| pytest fixture 是什么 | fixture 用于准备测试依赖,例如测试数据、临时文件、数据库连接、Mock 对象。pytest 根据测试函数参数名自动注入 fixture,使用 yield 可以在测试后执行清理逻辑。 | 测试 |
| Mock 应该怎么用 | Mock 用来隔离外部依赖,例如短信、邮件、支付、第三方接口和 AI 模型调用。单元测试应该测试自己的业务规则,但不能过度 Mock,否则测试会失真。 | 测试 |
| 覆盖率高就代表测试好吗 | 不一定。覆盖率只说明代码被执行过,不代表断言有效。好的测试要覆盖关键业务规则、边界条件和异常分支,并且有明确断言。 | 测试 |
| Python 和 AI 开发怎么结合 | Python 常用于模型 API 调用、数据清洗、文档解析、Embedding、向量检索、RAG 后端、FastAPI 接口、评估脚本和监控日志。重点不是只调通模型,而是把模型能力工程化。 | Python与AI开发 |
| Python 做 RAG 的完整流程是什么 | 离线阶段解析文档、清洗脱敏、切分 chunk、生成 Embedding、写入向量库;在线阶段把用户问题向量化,在权限范围内检索片段,重排序后组装 Prompt,调用模型生成答案并返回引用。 | Python与AI开发 |
| 为什么 RAG 要做权限过滤 | 因为向量检索可能召回用户无权查看的文档。如果先检索全部再让模型判断权限,敏感内容已经进入上下文。正确做法是先按用户权限限定可检索范围,再检索。 | Python与AI开发 |
| RAG 中 chunk 为什么不能随便切 | chunk 是检索和组装上下文的最小单元。切太小会丢上下文,切太大会带入噪声、增加 token 成本,还可能让模型被无关内容干扰。生产上要按标题、段落、表格、字段说明等语义边界切分,并保留来源、版本和权限元数据。 | Python与AI开发 |
| 为什么向量检索还要配合关键词检索 | 向量检索擅长语义相似,关键词检索擅长表名、字段名、错误码、接口名等精确匹配。商业系统里很多问题包含精确实体,只用向量检索容易漏掉真正答案,因此常用向量 + BM25/关键词 + Rerank 的混合检索。 | Python与AI开发 |
| Tool Calling 为什么不能让模型直接执行 | 模型只能生成工具调用建议,真实执行必须由后端校验参数、权限、幂等和审计。否则普通用户可能绕过权限,模型也可能生成危险参数,导致重复创建、误改数据或误发通知。 | Python与AI开发 |
| AI 应用上线前怎么评估 | 要准备黄金测试集,覆盖正常问答、无资料拒答、无权限、易混问题、结构化抽取和工具调用,记录答案、引用、工具参数、耗时和 token。改 Prompt、换模型或调整检索后都要跑回归,防止效果变差。 | Python与AI开发 |
| AI 接口为什么要记录 token 和耗时 | token 决定成本,耗时决定用户体验和系统容量。记录模型、输入输出 token、cost_ms、request_id、错误码后,才能分析成本上涨、慢请求、模型失败和用户调用行为。 | Python与AI开发 |
项目话术
text
在医疗数据采集与资产平台里,Python 可以用于数据清洗脚本、接口联调工具、批量文件处理、报表统计、爬虫采集、AI/RAG 评估脚本等。核心业务服务如果是 Java,也可以让 Python 承担离线处理和自动化工具角色,通过数据库、消息队列或 HTTP API 与主系统协作。常见追问
| 追问 | 回答方向 | 跳转 |
|---|---|---|
| 多线程为什么 CPU 计算不一定快 | 说明 CPython GIL 和 IO 密集/CPU 密集区别。 | 并发与异步 |
| 为什么不要裸写 SQL 拼接 | 说明 SQL 注入、参数化查询和白名单。 | 数据库访问 |
| 大文件怎么处理 | 说明流式读取、生成器、分块处理和内存控制。 | 异常与文件 |
| 线上日志为什么不能记录 Token | 说明日志平台权限、安全泄露、脱敏过滤和最小化记录原则。 | 日志与调试 |
| 单元测试和集成测试怎么区分 | 说明单元测试隔离业务规则,集成测试验证真实组件协作。 | 测试 |
| AI 回答错了怎么排查 | 先拆数据解析、chunk、Embedding、检索、权限、Prompt、生成和引用一致性。 | Python与AI开发 |
| 数据清洗怎么保证质量 | 说明缺失值、重复值、类型转换、异常值和校验规则。 | Pandas清洗分析 |
怎么判断 Python 是否真正学懂
| 验收问题 | 合格回答方向 | 深度知识点 |
|---|---|---|
| 为什么不能全局安装依赖 | 要讲虚拟环境、依赖隔离、版本固定、本地和服务器一致性。 | 从零到精通验收清单 |
| Python 变量为什么是对象引用 | 要讲名字绑定对象、可变对象共享、可变默认参数、浅拷贝风险。 | 从零到精通验收清单 |
| async 全站慢怎么排查 | 要查阻塞函数、同步 requests、同步数据库驱动、CPU 计算是否卡住事件循环。 | 从零到精通验收清单 |
| FastAPI 请求链路怎么走 | 要讲 Uvicorn、ASGI、路由、Pydantic 校验、依赖注入、序列化响应。 | 从零到精通验收清单 |
| RAG 为什么不能只调模型 API | 要讲私有知识、权限过滤、检索、引用、评估、token 成本和审计。 | 从零到精通验收清单 |
面试回答模板
text
Python 我会从应用场景和工程能力回答。基础上要掌握数据结构、函数模块、面向对象、异常文件和类型标注;并发上要区分多线程、异步和多进程;项目里常用于脚本自动化、Web API、数据处理、测试和 AI 应用。真正落地时要关注编码、资源关闭、异常处理、依赖管理、测试、日志和性能边界。本章小结
Python 面试页负责“怎么答”。每个问题的原理、流程图、代码 Demo 和风险排查,都要跳到对应知识点页学习。完整验收按 Python 从零到精通验收清单 逐项检查。
