vinqi.com

Python开发工程师面试题及答题要点

Python工程师(也叫Python后端)的面试通常 2-4 轮:一面考语言基础和代码,二面深挖项目,三面偏系统设计和团队匹配。最容易挂的不是答不出八股,而是项目细节经不起追问,以及手写代码时暴露基本功问题。

专业基础

讲一下 Python 的 GIL 是什么,它对你的日常开发有什么影响?

考察点:考察是否真正理解 Python 运行机制,而不是只会背概念。

答题要点:
  1. 先一句话说清:GIL 是解释器级的全局锁,同一时刻只有一个线程执行 Python 字节码。
  2. 马上落到实际影响:CPU 密集任务多线程没有加速效果,I/O 密集任务多线程仍然有效。
  3. 给出替代方案:CPU 密集用多进程或 C 扩展,I/O 密集用 asyncio。
  4. 如果了解可以补一句:新版本 Python 在尝试放宽 GIL,说明你持续关注语言演进。

别踩:只背定义不结合场景,或者说「Python 不能多线程」这种绝对化错误结论。

可变对象和不可变对象有什么区别?举个实际踩过坑的例子。

考察点:考察基础是否扎实,以及有没有真实的调试经验。

答题要点:
  1. 先答定义:list、dict 可变,str、tuple、int 不可变,可变对象作为函数默认参数会被共享。
  2. 一定要给真实例子,比如默认参数是 list 导致多次调用数据累积的 bug。
  3. 说明排查方式:通过打印或断点发现状态被意外保留。
  4. 总结习惯:默认参数用 None,函数内再初始化。

别踩:只说概念不举例子,面试官会怀疑你没写过多少 Python。

装饰器是什么?你写过哪些装饰器?

考察点:考察对 Python 语言特性的掌握深度和工程实践。

答题要点:
  1. 一句话定义:装饰器是接收函数并返回新函数的高阶函数,用 @ 语法应用。
  2. 必须举自己写过的例子:如接口耗时统计、重试、权限校验、缓存。
  3. 提到进阶点:functools.wraps 保留元信息、带参数的装饰器要再包一层。
  4. 如果用过框架的装饰器路由,可以对比说明原理相通。

别踩:只会写 hello world 级别的计时装饰器,说不出工程里的真实用途。

Python 的内存管理和垃圾回收机制了解吗?

考察点:考察对语言底层的理解,判断是使用者还是钻研者。

答题要点:
  1. 核心机制:引用计数为主,标记清除和分代回收解决循环引用。
  2. 结合实际:大量创建对象时注意循环引用,可用 weakref 打破。
  3. 提到排查工具:如内存分析库定位泄漏,说明你处理过线上问题。
  4. 不知道细节就诚实说了解层面,别硬编。

别踩:把 Java 的 JVM 回收机制说成 Python 的,暴露只是背书。

代码与算法手写

现场写一下:统计一个日志文件里出现次数最多的 IP。

考察点:考察编码基本功和用 Python 标准库解决实际问题的能力。

答题要点:
  1. 先说思路再动手:逐行读、正则或 split 提取 IP、dict 计数、取最大值。
  2. 写代码时注意大文件场景,用逐行迭代而不是 readlines 一次读入。
  3. 主动提优化:collections.Counter 一行搞定,体现熟练度。
  4. 写完自己过一遍边界:空文件、格式异常的行怎么处理。

别踩:不问数据量就闷头写,忽略大文件内存问题;或写完不检查直接交。

手写一个 LRU 缓存。

考察点:考察数据结构功底和 Python 内置工具的熟练运用。

答题要点:
  1. 先讲清 LRU 语义:容量满时淘汰最久未访问的条目。
  2. 标准做法:dict 加双向链表,get 和 put 都做到 O(1)。
  3. 加分做法:直接说 Python 标准库有现成的有序字典实现思路,然后手写。
  4. 主动跑一个用例验证,展示测试意识。

别踩:只会用 list 存顺序导致复杂度退化,被追问性能就答不上。

这道题用生成器能不能做?什么场景该用生成器?

考察点:考察是否理解 Python 的惰性求值思想和内存意识。

答题要点:
  1. 说清场景:处理大文件、大流式数据时,生成器按需产出,不占整块内存。
  2. 能写出 yield 版本的代码,而不是只讲概念。
  3. 提到代价:只能遍历一次、不方便取长度,小数据没必要用。
  4. 结合项目:如日志分析、数据清洗管道里实际用过。

别踩:把生成器和列表推导式混为一谈,或说「性能一定更好」这种片面结论。

项目经历深挖

挑一个你最有代表性的项目,讲讲你在里面负责了什么。

考察点:考察表达结构、真实参与度,以及能否分清个人贡献和团队成果。

答题要点:
  1. 用「背景—职责—方案—结果」结构讲,控制在两分钟内。
  2. 明确说清你个人写的模块、做的技术决策,别把团队成果说成自己的。
  3. 结果尽量量化:接口耗时从多少降到多少、支撑多少调用量。
  4. 预判追问点:提前想好最难的三个技术细节怎么讲。

别踩:讲成流水账或项目介绍,全程「我们我们」,听不出你干了什么。

这个项目里你遇到过最难的问题是什么,怎么解决的?

考察点:考察问题定位能力和排查思路是否真实。

答题要点:
  1. 选一个真实且有技术含量的问题,别挑太简单的。
  2. 讲清排查链条:现象、假设、验证手段(日志、监控、断点)、最终根因。
  3. 说明修复方案和后续预防措施,比如加了监控或告警。
  4. 体现独立解决的部分,而不是全靠同事或搜索。

别踩:只讲结果不讲过程,或编一个网上抄来的问题,一追问细节就露馅。

如果让你现在重新做这个项目,你会改哪些设计?

考察点:考察技术反思能力和成长性,看你是否真的消化了项目。

答题要点:
  1. 准备 2-3 个真实的改进点,比如模块耦合、异常处理、缺少测试。
  2. 每个点说清当时的取舍:为什么当时那么做,现在为什么觉得要改。
  3. 体现权衡意识,而不是全盘否定过去的方案。
  4. 可以提到新学到的技术如何应用,展示持续学习。

别踩:说「没什么可改的」,或反过来把项目贬得一无是处。

你项目里的接口性能是怎么优化的?

考察点:考察性能意识和实操经验,区分调库和真优化过的人。

答题要点:
  1. 先讲定位手段:压测、慢日志、链路追踪,找到瓶颈再动手。
  2. 给具体手段:加缓存、改查询、批量处理、异步化,说明各自适用场景。
  3. 必须给前后数据对比,哪怕是大致量级。
  4. 诚实说明哪些优化是别人做的,哪些是你做的。

别踩:只说「加了缓存变快了」,说不出瓶颈在哪、快了多少。

工程与系统设计

你平时怎么做异常处理和日志规范?

考察点:考察工程素养,判断是否在规范团队待过。

答题要点:
  1. 说清分层:什么该捕获、什么该往上抛、什么该记日志后兜底。
  2. 反对裸 except:捕获要具体,避免吞掉所有异常掩盖问题。
  3. 日志讲规范:分级使用、关键链路带上下文和请求 ID。
  4. 结合例子:讲一次靠日志快速定位线上问题的经历。

别踩:说「到处 try except 保证不报错」,这是典型的反模式回答。

设计一个简单的短链接服务,说说你的方案。

考察点:考察系统设计入门能力:存储、编码、跳转、高并发的基本思考。

答题要点:
  1. 先问清需求:量级、是否需要自定义短码、有效期。
  2. 核心方案:长链接做唯一键,短码用自增 ID 转进制或哈希生成。
  3. 讲读优化:跳转是高频读,用缓存挡住大部分流量。
  4. 提边界:短码冲突处理、恶意链接治理,展示完整性思考。

别踩:不问需求直接堆技术名词,或方案经不起「并发上来怎么办」的追问。

Python 服务部署上线,你关注哪些事情?

考察点:考察是否具备生产意识,而不只是本地跑通代码。

答题要点:
  1. 讲依赖管理:锁定依赖版本,保证环境一致。
  2. 讲服务方式:用生产级应用服务器跑,不用开发服务器。
  3. 讲上线保障:灰度或回滚方案、监控告警、日志留存。
  4. 结合自己经历:说一次上线或排查线上问题的实际过程。

别踩:只说「写完代码交给运维」,暴露没碰过生产环境。

行为面试与反问环节

说一次你和同事在技术方案上有分歧的经历,最后怎么处理的?

考察点:考察协作方式和沟通成熟度,是否固执或没有主见。

答题要点:
  1. 选真实的小分歧,别编戏剧化冲突。
  2. 讲清你的处理方式:先对齐目标,再对比方案优劣,用数据或验证说话。
  3. 结果可以是对方对也可以是你对,重点是你能接受更优方案。
  4. 体现对事不对人的态度。

别踩:把故事讲成「我据理力争说服了对方」,显得固执不好合作。

你为什么想离开现在的公司?

考察点:考察离职动机是否合理,判断入职后的稳定性。

答题要点:
  1. 从发展角度回答:想接触更大规模的系统、更核心的业务或新技术栈。
  2. 可以客观提现状限制,但不贬低前公司和前领导。
  3. 把动机和目标岗位的亮点挂钩,形成闭环。
  4. 保持简短,别展开抱怨。

别踩:吐槽薪资、吐槽领导、吐槽加班,负面情绪外露是大忌。

你还有什么想问我们的?

考察点:考察你对这个机会的认真程度和关注点是否成熟。

答题要点:
  1. 问业务:团队负责的核心业务和技术栈构成。
  2. 问成长:新人入职后的协作方式和晋升路径。
  3. 问挑战:当前团队面临的最大技术问题是什么。
  4. 准备 2-3 个问题,别问薪资福利(留给 HR 环节),也别说没问题。

别踩:说「没什么想问的」,显得没兴趣;或一上来只问加班和薪资。

面试准备清单

什么时候要做什么
面试前 3 天把简历上每个项目按「背景—职责—方案—结果」写成两分钟版本,并为每个项目准备 3 个可能被追问的技术细节的答案。
面试前 3 天过一遍 Python 高频考点:GIL、装饰器、生成器、深浅拷贝、垃圾回收、常用数据结构的时间复杂度,每个考点能用自己的话讲 1 分钟。
面试前 2 天刷 5-8 道手写题:LRU 缓存、日志统计、两数之和级别的题、一个字符串处理题,重点练边写边讲思路的习惯。
面试前一天查目标公司的业务和技术栈,把简历里的项目和对方业务能挂钩的地方标出来,准备 2-3 个反问问题。
面试前一天如果是视频或现场面,确认开发环境可用:Python 版本、顺手的编辑器;线上手写代码时环境问题会严重拖慢速度。
面试当天提前 10 分钟到场或进会议;手写题拿到先复述题意、说思路再动笔,写完主动跑一个测试用例。

常见问题

Python 开发面试一般有几轮?
常见 2-4 轮:一面多为技术基础和手写代码,二面深挖项目和系统设计,部分公司有三面(总监面或交叉面),最后是 HR 面谈薪资和动机。中小公司可能压缩到 1-2 轮技术面加 HR 面。
没有大厂经验,项目讲什么比较好?
讲你参与最深、能说清技术细节的项目,哪怕是中小公司的业务系统。面试官看重的是排查问题的思路和真实参与度,把一个普通项目的难点讲透,比空泛地吹大项目更有效。
面试手写代码允许查文档吗?
多数线上面试允许问面试官确认 API 用法,但核心逻辑必须自己写。平时练习时就少依赖自动补全,常用标准库的方法名要形成肌肉记忆,现场卡在基础语法上会直接减分。
八股文背得很熟但还是挂,为什么?
大概率挂在项目追问或手写环节。八股只是入场券,面试官真正筛人的方式是沿你的项目连问三层「为什么」,以及看代码写得干不干净。准备时把七成精力放在项目细节和手写练习上。

继续看这个岗位

相关岗位