主题
Python 面试高频题总索引
本文件汇总 14 个章节的高频面试题,按章节归类、按难度标星。 每题完整答案(含「考察点 / 标准答案 / 加分项 / 易错点」)请跳转到对应章节文档的「面试高频题」小节查看。
难度图例
- ⭐ 入门必会(基础题)
- ⭐⭐ 进阶常考
- ⭐⭐⭐ 大厂高频
- ⭐⭐⭐⭐ 资深岗位 / 字节阿里腾讯一面必问
第 1 章 · Python 是什么 & 为什么火
详细答案见
01_intro.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | Python 是解释型还是编译型语言? | ⭐⭐ | 编译为字节码 / PVM 解释 / 混合型 |
| 2 | CPython / Jython / PyPy 有什么区别? | ⭐⭐⭐ | 实现 / JIT / JVM |
| 3 | .pyc 文件是什么?什么时候生成? | ⭐⭐ | 字节码缓存 / __pycache__ |
| 4 | 一行 print('hi') 背后发生了什么? | ⭐⭐⭐⭐ | 词法 / 语法 / 字节码 / PVM |
| 5 | Python 2 和 Python 3 最关键的区别? | ⭐ | print / unicode / 整除 / range |
| 6 | 为什么 Python 用缩进做语法? | ⭐ | 强制风格 / 减少括号 / PEP 8 |
第 2 章 · 基础语法与数据类型
详细答案见
02_basic_types.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | is 和 == 的区别?小整数缓存陷阱? | ⭐⭐⭐ | id / 值比较 / [-5,256] |
| 2 | 列表和元组的核心区别?为什么有元组? | ⭐⭐ | 可变 / 哈希 / 性能 |
| 3 | 字典是怎么实现的?为什么 3.7 后有序? | ⭐⭐⭐⭐ | 开放寻址 / 紧凑布局 / 插入序 |
| 4 | 浅拷贝和深拷贝的区别?什么时候各用? | ⭐⭐⭐ | copy / deepcopy / 嵌套引用 |
| 5 | 字符串拼接 + 和 ''.join() 哪个快?为什么? | ⭐⭐⭐ | 不可变 / O(n²) / O(n) |
| 6 | f-string、%、.format() 怎么选? | ⭐ | 性能 / 可读性 |
第 3 章 · 控制流与函数
详细答案见
03_flow_function.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | 函数默认参数为可变对象有什么坑? | ⭐⭐⭐ | 默认值只算一次 / None 哨兵 |
| 2 | *args 和 **kwargs 怎么用? | ⭐⭐ | 解包 / 转发 |
| 3 | 闭包是什么?常见应用场景? | ⭐⭐⭐ | 函数 + 环境 / 装饰器基础 |
| 4 | LEGB 作用域规则是什么? | ⭐⭐⭐ | Local / Enclosing / Global / Builtin |
| 5 | global 和 nonlocal 的区别? | ⭐⭐ | 模块级 vs 嵌套函数 |
| 6 | 列表推导和 map 哪个更 Pythonic? | ⭐⭐ | 可读性 / 性能 |
第 4 章 · 面向对象编程
详细答案见
04_oop.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | __init__ 和 __new__ 的区别? | ⭐⭐⭐ | 创建 vs 初始化 / 单例模式 |
| 2 | Python 的多继承 MRO 是怎么算的? | ⭐⭐⭐⭐ | C3 线性化 / 钻石继承 |
| 3 | @classmethod / @staticmethod 区别? | ⭐⭐ | cls / 普通函数包装 |
| 4 | __slots__ 的作用?什么时候用? | ⭐⭐⭐ | 节省内存 / 禁止动态属性 |
| 5 | @property 怎么实现的? | ⭐⭐⭐ | 描述符协议 |
| 6 | 元类(metaclass)是什么?什么时候用? | ⭐⭐⭐⭐ | type / ORM / 框架 |
第 5 章 · 模块、包与依赖管理
详细答案见
05_module_package.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | import 的查找顺序是什么? | ⭐⭐⭐ | 内置 / sys.path / 缓存 |
| 2 | __init__.py 有什么作用?空文件可以吗? | ⭐⭐ | 标识包 / 命名空间包 |
| 3 | 相对导入 vs 绝对导入区别? | ⭐⭐ | . / 模块运行 |
| 4 | 为什么要用虚拟环境?怎么创建? | ⭐⭐ | 隔离 / venv / 多版本 |
| 5 | pip / poetry / uv 怎么选? | ⭐⭐ | 锁文件 / 速度 |
第 6 章 · 异常处理与文件 IO
详细答案见
06_exception_io.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | try/except/else/finally 各自什么时候执行? | ⭐⭐ | else 无异常 / finally 总执行 |
| 2 | 用 except Exception 捕获所有异常有什么坑? | ⭐⭐⭐ | 吞异常 / KeyboardInterrupt |
| 3 | 上下文管理器是什么?怎么实现? | ⭐⭐⭐ | with / __enter__ / __exit__ |
| 4 | @contextmanager 怎么实现上下文管理? | ⭐⭐⭐ | 生成器 / yield |
| 5 | open 不用 with 会有什么问题? | ⭐⭐ | 资源泄漏 / 文件句柄 |
第 7 章 · 迭代器、生成器、装饰器
详细答案见
07_iter_gen_decorator.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | 可迭代对象 vs 迭代器区别? | ⭐⭐⭐ | __iter__ / __next__ |
| 2 | 生成器和列表的本质区别?什么时候用生成器? | ⭐⭐⭐ | 惰性求值 / 内存 |
| 3 | yield from 比 for + yield 好在哪? | ⭐⭐⭐ | 委托 / 异常透传 |
| 4 | 装饰器原理?为什么需要 functools.wraps? | ⭐⭐⭐⭐ | 函数对象 / 元数据 |
| 5 | 写一个带参数的装饰器(如重试 N 次) | ⭐⭐⭐⭐ | 三层闭包 |
| 6 | 类装饰器和函数装饰器区别? | ⭐⭐⭐ | __call__ |
第 8 章 · 并发:多线程 / 多进程 / GIL
详细答案见
08_concurrency.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | 什么是 GIL?为什么 Python 有 GIL? | ⭐⭐⭐⭐ | 线程安全 / 引用计数 / 性能权衡 |
| 2 | GIL 让多线程没用?什么场景适合多线程? | ⭐⭐⭐⭐ | IO 密集仍有效 |
| 3 | 多线程 vs 多进程 vs 协程怎么选? | ⭐⭐⭐ | IO / CPU / 高并发 |
| 4 | multiprocessing 比 threading 慢在哪? | ⭐⭐⭐ | 进程创建 / IPC |
| 5 | Lock / RLock / Semaphore 区别? | ⭐⭐⭐ | 重入 / 信号量 |
| 6 | Python 3.13 的 No-GIL 是什么? | ⭐⭐⭐⭐ | PEP 703 |
第 9 章 · 异步编程 asyncio
详细答案见
09_asyncio.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | 协程和线程的本质区别? | ⭐⭐⭐ | 用户态 / 内核态 |
| 2 | async def 函数直接调用会发生什么? | ⭐⭐⭐ | 返回协程对象 / 不执行 |
| 3 | 事件循环是怎么调度的? | ⭐⭐⭐⭐ | epoll / Future / Task |
| 4 | await 一个非 awaitable 会怎样? | ⭐⭐ | TypeError |
| 5 | 同步代码混入 asyncio 会怎样? | ⭐⭐⭐ | 阻塞事件循环 / executor |
| 6 | gather 和 wait 的区别? | ⭐⭐⭐ | 异常处理 / 返回值 |
第 10 章 · 标准库精华
详细答案见
10_stdlib.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | defaultdict 和 dict.setdefault 区别? | ⭐⭐ | 默认工厂 |
| 2 | Counter 怎么快速找 Top N? | ⭐⭐ | most_common |
| 3 | lru_cache 是怎么实现的?怎么清空? | ⭐⭐⭐ | 双向链表 + dict |
| 4 | 正则贪婪 vs 非贪婪?怎么写不回溯的正则? | ⭐⭐⭐ | *? / 原子组 |
| 5 | logging 五大级别?怎么写到文件? | ⭐⭐ | DEBUG/INFO/WARNING/ERROR/CRITICAL |
第 11 章 · 内存模型与垃圾回收
详细答案见
11_memory_gc.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | Python 的引用计数机制怎么工作? | ⭐⭐⭐ | refcount 字段 / +1/-1 |
| 2 | 循环引用怎么解决?分代 GC 是什么? | ⭐⭐⭐⭐ | 3 代 / 阈值 / 不可达 |
| 3 | __del__ 有什么坑? | ⭐⭐⭐ | 循环引用阻止 GC |
| 4 | 为什么有小整数缓存?范围多少? | ⭐⭐⭐ | [-5, 256] |
| 5 | 字符串驻留 intern 是什么? | ⭐⭐⭐ | 标识符 / sys.intern |
| 6 | 弱引用什么时候用? | ⭐⭐⭐ | 缓存 / 观察者模式 |
第 12 章 · 性能优化与调试
详细答案见
12_performance.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | timeit 和 time.time() 区别? | ⭐⭐ | 多次取最小 |
| 2 | cProfile 怎么用?怎么读结果? | ⭐⭐⭐ | tottime / cumtime |
| 3 | 一段慢代码怎么排查? | ⭐⭐⭐⭐ | 火焰图 / line_profiler |
| 4 | numba 和 cython 区别? | ⭐⭐⭐ | JIT / AOT |
| 5 | pdb 常用命令? | ⭐⭐ | n / s / c / b / p |
第 13 章 · 常用第三方库
详细答案见
13_libraries.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | requests 和 urllib 区别? | ⭐ | API 友好 / Session |
| 2 | numpy 为什么比 list 快这么多? | ⭐⭐⭐ | 连续内存 / 向量化 / SIMD |
| 3 | pandas 的 apply 比循环快吗? | ⭐⭐⭐ | 仍是 Python 循环 / 矢量化 |
| 4 | FastAPI 比 Flask 快在哪? | ⭐⭐⭐ | ASGI / 类型注解 / 自动文档 |
| 5 | pydantic 是怎么做数据校验的? | ⭐⭐⭐ | 模型类 / Rust 内核 v2 |
第 14 章 · 综合实战项目
详细答案见
14_project.md
| # | 题目 | 难度 | 关键词 |
|---|---|---|---|
| 1 | 设计一个 CLI 工具应该考虑哪些方面? | ⭐⭐⭐ | argparse / 配置 / 日志 |
| 2 | 设计一个并发爬虫怎么避免被封? | ⭐⭐⭐⭐ | 限速 / UA / 代理池 / 重试 |
| 3 | FastAPI 项目怎么组织目录结构? | ⭐⭐⭐ | 分层 / 路由 / 服务 / 仓储 |
🎯 高频「跨章节」综合题
| # | 题目 | 涉及章节 |
|---|---|---|
| A | 实现一个线程安全的单例模式(多种方式) | Ch 4 + Ch 8 |
| B | 用装饰器实现一个 LRU 缓存 | Ch 7 + Ch 10 |
| C | 写一个异步爬虫,并发数限制为 10 | Ch 7 + Ch 9 + Ch 13 |
| D | 设计一个生产者-消费者模型(线程版 + 协程版) | Ch 8 + Ch 9 |
| E | Python 项目部署上线要考虑什么? | Ch 5 + Ch 13 |