Python面试题
作者 Aaron Cao · 更新于
预期会有三个层次:语言机制(例如可变性、生成器和装饰器);运行时行为(例如GIL);以及数据结构方面的实际编码。大多数被拒案例源于对“为什么”解释得太单薄,而不是语法写错。
反复出现的那些问题
把两百道Python题目从头刷到尾,看起来很努力,却很少能改变面试结果。本节把范围收窄到那些在电话面试和技术面试中反复出现的少数问题,并说明一个有力的回答应该包含什么。少数几个语言特性承载了大部分的考察信号。
- 可变默认参数。为什么
def f(x=[])会在多次调用之间累积数值?默认值只在函数定义时求值一次,而不是每次调用都重新求值。 - 生成器与列表。
yield什么时候比构建一个列表更好?当序列很大,或者你可能提前停止读取时。 - 装饰器。装饰器实际返回的是什么?为什么包装函数需要
functools.wraps? - GIL。为什么CPU密集型线程在CPython中无法很好地扩展?此时你会转而使用什么?
- 浅拷贝与深拷贝。当用切片复制一个嵌套结构时,会出现什么问题?
- 同一性与相等性。为什么在shell中对小整数测试
is会得到一个具有误导性的结果。
决定通过还是被刷的关键
两位候选人可能给出完全相同、正确的GIL定义,但只有一位能进入下一轮。差别通常在第二句话。
一位在某公有云厂商面试L5后端工程师岗位的候选人,被问到为什么他们的服务在高负载下变慢。他先说出了GIL,然后继续往下说:热点路径是JSON解析,所以线程不是合适的工具,把这一步迁移到进程池后吞吐量恢复了正常。说出限制因素只能拿到部分分数,把它和一个具体决策联系起来才能拿下这一轮。
把每个回答分成三个部分来组织:这个特性做什么、它为什么存在、以及你什么时候会避免使用它。第三部分是大多数候选人会跳过的部分,也正是它体现出判断力。关于编码题、行为面试和系统设计面试的其他文章,归类在面试类型专题下。
如何准备,而不是死记硬背
读懂一个答案和说出一个答案是两种不同的能力,而面试考察的只是后者。请大声练习,掐着时间,用你在真实通话中会用的措辞来说。
- 把每个反复出现的问题的答案写成三句话,然后不看稿子把它说出来。
- 挑出你每天都在用的两个特性,为每一个准备一个诚实的局限性说明。能够批评自己所用的工具,会显得更有经验。
- 准备一个真实的调试故事:某次Python的行为让你意外,而你后来弄清楚了原因。
- 把应用编程部分单独练习:字典、集合、带key函数的排序,以及字符串处理,覆盖了大部分面试的考察范围。
如果你想在真正面试之前,先和一个AI面试官进行一场限时模拟,可以前往模拟面试页面。
实时助手能帮上什么忙,又帮不上什么忙
SubcueAI是一款面向macOS和Windows的原生桌面应用。它会捕捉通话双方的声音,实时转录内容,并在一个悬浮窗上展示答题框架——这个悬浮窗只停留在你本机,因此它不会以参会者或机器人的身份加入会议。对于Python面试环节来说,有用的输出是一个结构提示,而不是一份现成的答案:具体内容必须由你自己来填,因为追问会围绕你刚刚描述的代码展开。
诚实说明能力边界,比强调能力本身更重要。如果你共享了屏幕,屏幕上的一切都会被共享出去。如果面试环节使用了监考评测平台,或者在公司托管的设备上进行,助手工具就不在适用范围内。设置和权限说明详见教程页面。