Python常见面试题及解答总结
以下是 Python 常见的面试题及简要答案示例,覆盖基础语法、数据结构、算法和高级特性等方向:
一、Python 基础
- Python 中可变(Mutable)和不可变(Immutable)数据类型有哪些?
O 不可变:int, float, str, tuple, bool, frozenset
O 可变:list, dict, set, bytearray
- 列表(List)和元组(Tuple)的区别?
O 列表可变,元组不可变;
O 列表用 [],元组用 ();
O 元组适合存储固定数据(如配置项),性能略优。
- 解释装饰器(Decorator)的作用,写一个记录函数执行时间的装饰器。
python
import time
def timer_decorator(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
print(f"{func.__name__} 执行时间: {time.time() - start:.2f}秒")
return result
return wrapper
@timer_decorator
def my_function():
time.sleep(1)
- 生成器(Generator)和迭代器(Iterator)的区别?
O 生成器是迭代器的一种,通过 yield 关键字实现,惰性计算,节省内存;
O 迭代器需实现 __iter__ 和 __next__ 方法。
- 解释 GIL(Global Interpreter Lock)及其影响。
O GIL 是 CPython 解释器的全局锁,同一时刻仅一个线程执行 Python 字节码;
O 导致多线程无法充分利用多核 CPU,适合 I/O 密集型任务,计算密集型建议用多进程。
二、数据结构与算法
- 如何去除列表中的重复元素并保持顺序?
python
def remove_duplicates(lst):
seen = set()
return [x for x in lst if not (x in seen or seen.add(x))]
- 反转字符串(如 "hello" → "olleh")。
python
s = "hello"
reversed_s = s[::-1]
- 找出列表中重复的元素(时间复杂度 O(n))。
python
from collections import Counter
def find_duplicates(lst):
return [k for k, v in Counter(lst).items() if v > 1]
- 快速排序实现。
python
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
三、面向对象编程
- 类变量和实例变量的区别?
O 类变量由所有实例共享,实例变量属于特定实例。
- 实现单例模式(Singleton)。
python
class Singleton:
_instance = None
def __new__(cls):
if not cls._instance:
cls._instance = super().__new__(cls)
return cls._instance
- 魔术方法 __str__ 和 __repr__ 的区别?
O __str__ 用于用户友好的字符串表示(如 print(obj));
O __repr__ 用于开发者调试,应明确对象信息。
四、高级特性
- 深拷贝(Deep Copy)和浅拷贝(Shallow Copy)的区别?
- 浅拷贝(copy.copy())复制顶层对象,引用嵌套对象;
- 深拷贝(copy.deepcopy())递归复制所有对象。
- 闭包(Closure)是什么?写一个例子。
python
def outer_func(x):
def inner_func(y):
return x + y
return inner_func
closure = outer_func(10)
print(closure(5)) # 输出 15
五、编码题示例
- 斐波那契数列生成器:
python
def fibonacci(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
- 检查括号是否匹配:
python
def is_valid_parentheses(s):
stack = []
mapping = {')': '(', '}': '{', ']': '['}
for char in s:
if char in mapping:
top = stack.pop() if stack else '#'
if mapping[char] != top:
return False
else:
stack.append(char)
return not stack
六、其他常见问题
- Python 的垃圾回收机制(引用计数 + 分代回收)。
- 多进程 vs 多线程的应用场景。
- Django 和 Flask 的核心区别?
- Python 3.8+ 的新特性(如海象运算符 :=,位置参数 /)。
面试时需结合具体场景灵活回答,建议通过实际项目经验举例说明。