基础语法与数据类型
Python中可变与不可变数据类型的区别是什么?可变类型包括列表、字典、集合,修改时内存地址不变;不可变类型包括数字、字符串、元组,修改时会创建新对象。
深拷贝与浅拷贝的区别是什么?浅拷贝只复制父对象,子对象仍共享引用;深拷贝会递归复制所有子对象,完全独立。可使用copy模块的deepcopy()实现。
列表推导式与生成器表达式的区别?列表推导式用[]立即生成列表,占用内存;生成器表达式用()返回迭代器,惰性计算节省内存。
函数与装饰器
*args和**kwargs的作用是什么?*args接收任意数量位置参数,**kwargs接收任意数量关键字参数,常用于函数参数传递的灵活性。
装饰器的实现原理是什么?装饰器本质是接受函数作为参数的高阶函数,通过闭包和函数嵌套实现功能扩展,常用@语法糖简化调用。
闭包的定义与使用场景?闭包指嵌套函数引用外层非全局变量,常见于装饰器、回调函数等需要保持状态的场景。
面向对象编程
类变量与实例变量的区别?类变量由所有实例共享,通过类名或实例访问;实例变量属于单个实例,通过self绑定。
__new__与__init__的区别?__new__负责创建实例,返回实例对象;__init__负责初始化实例属性,无返回值。
多继承的MRO顺序如何确定?Python使用C3算法确定方法解析顺序,可通过类名.__mro__查看继承链。
并发与异步
GIL对多线程的影响是什么?全局解释器锁限制同一时刻只有一个线程执行字节码,CPU密集型任务建议用多进程替代。
协程与线程的区别?协程是用户态轻量级线程,通过事件循环调度;线程是内核态调度,协程更高效但无法利用多核。
asyncio的核心组件有哪些?包括事件循环、协程、Future对象和任务,用于编写单线程并发代码。
内存管理与性能优化
引用计数与垃圾回收机制如何工作?引用计数为主,无法解决循环引用时,分代回收机制介入处理。
如何分析Python程序性能?使用cProfile模块统计函数耗时,memory_profiler分析内存使用,timeit测量代码片段执行时间。
常见的性能优化手段有哪些?包括使用内置函数、减少全局变量、局部变量访问更快、利用lru_cache缓存等。
标准库与第三方库
collections模块的常用类有哪些?defaultdict自动初始化字典,Counter统计元素频率,deque双端队列等。
itertools模块的核心功能是什么?提供迭代器工具如chain连接迭代器,groupby分组,product笛卡尔积等。
requests库如何处理会话?通过Session对象保持cookies和连接池,适合多次请求同一主机场景。
代码规范与设计模式
PEP8规范的主要要求有哪些?包括4空格缩进、行字符不超过79、导入分行、操作符两侧空格等。
单例模式的Python实现方式?使用模块天然单例特性,或通过__new__控制实例化,或装饰器实现。
工厂模式的应用场景?当创建逻辑复杂时,通过工厂方法封装对象创建过程,降低耦合度。
算法与数据结构
实现快速排序的Python代码:
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)
二叉树层次遍历的实现:
python
from collections import deque
def level_order(root):
if not root: return []
queue = deque([root])
res = []
while queue:
level = []
for _ in range(len(queue)):
node = queue.popleft()
level.append(node.val)
if node.left: queue.append(node.left)
if node.right: queue.append(node.right)
res.append(level)
return res
数据库与ORM
SQLAlchemy核心组件有哪些?包括Engine连接池、Session会话管理、ORM映射模型和查询API。
如何优化Django的数据库查询?使用select_related预取外键,prefetch_related预取多对多,only指定查询字段避免全量加载。
Web开发相关
Django中间件的工作流程?请求阶段按顺序执行process_request,视图处理后逆序执行process_response,支持异常处理中间件。
Flask的上下文机制是什么?应用上下文存储全局数据,请求上下文存储请求周期数据,通过栈结构管理多应用/请求场景。
异常处理与调试
自定义异常的实现方式?继承Exception类,可添加额外属性,通过raise触发,try/except捕获。
如何调试内存泄漏问题?使用objgraph可视化对象引用关系,gc模块检查不可达对象,tracemalloc跟踪内存分配。