python面试重在考察用语言解决真实问题的能力,聚焦数据结构理解、边界处理、代码可读性及逻辑调试能力,典型题如字符串反转、两数之和、装饰器、生成器均强调原理与实践结合。

Python面试真题不是考死记硬背,而是看你怎么用语言解决真实问题。 面试官关注的是你对数据结构的理解、边界处理的意识、代码的可读性,以及是否能快速定位和修复逻辑漏洞。下面结合高频真题,拆解思路、陷阱和优化路径。
字符串反转:别只写 s[::-1]
看似简单,但常被用来考察基础功底和沟通能力。面试官可能追问:
- 如果字符串含 Unicode(如中文、emoji),切片是否安全?——是的,Python 3 中 str 默认 Unicode,
s[::-1]没问题 - 要求空间复杂度 O(1)?那得转成 list 原地交换,再 join 回字符串
- 输入可能是 None 或非字符串类型?需加类型检查和异常处理
推荐写法(兼顾鲁棒性与清晰度):
def reverse_string(s):if not isinstance(s, str):
raise TypeError("Input must be a string")
return s[::-1]
两数之和:哈希表不是唯一解,但要懂为什么它最优
题目:给定整数列表 nums 和目标值 target,返回两个数的下标(假设唯一解)。
立即学习“Python免费学习笔记(深入)”;
- 暴力法 O(n²):双层 for 循环 —— 可作为起点,但必须主动说明其缺陷
- 哈希表 O(n):遍历中用字典存 值→下标,对每个 num 检查
target - num是否已存在 - 关键细节:字典查找均摊 O(1),但插入和哈希计算有常数开销;若要求返回所有解,需改用列表存多个下标
易错点:在循环开头就存当前值,会导致 num + num == target 的误匹配。正确做法是「先查后存」。
装饰器实现:从 @timer 到带参装饰器,分三步讲清楚
面试官不指望你默写 functools.wraps,但希望你理解闭包、函数一等公民、执行时机。
- 无参装饰器:返回一个包裹原函数的新函数
- 带参装饰器:多一层嵌套,最外层接收装饰器参数,返回真正的装饰器
- 务必用
@functools.wraps(func)保留原函数的 __name__、__doc__ 等元信息,否则调试和文档会出问题
示例(带单位的计时器):
def timer(unit="s"): # 装饰器参数def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
elapsed = time.time() - start
if unit == "ms": elapsed *= 1000
print(f"{func.__name__} took {elapsed:.2f} {unit}")
return result
return wrapper
return decorator
生成器 vs 迭代器:用 yield 写斐波那契,顺便说清“惰性求值”
写一个生成器函数比写类实现迭代器更常见,也更能体现 Python 特性。
- 生成器函数调用后返回 generator 对象,不立即执行,只有 next() 或 for 循环触发时才运行到下一个 yield
- yield 不仅返回值,还保存当前栈帧(局部变量、执行位置),下次继续从 yield 后恢复
- 对比:list 推导式一次性生成全部数据,内存占用高;生成器适合处理大文件、流式数据或无限序列
简洁版斐波那契生成器:
def fib():a, b = 0, 1
while True:
yield a
a, b = b, a + b
# 使用:取前10项
list(itertools.islice(fib(), 10))










