Python面试题
Python 的函数参数传递有什么特点?
Python 传递的是对象引用。
- 不可变对象:函数内部重新赋值通常不影响外部。
- 可变对象:函数内部原地修改会影响外部。
因此它既不是简单的值传递,也不是传统意义上的引用传递,更准确地说是“对象引用传递”。
什么是元类(metaclass)?
元类可以理解为“用来创建类的类”。
- 普通类用来创建对象。
- 元类用来创建普通类。
Python 中类本身也是对象,因此类也可以由更高层的元类来生成和控制。
@staticmethod 和 @classmethod 有什么区别?
@staticmethod:不绑定实例,也不绑定类。@classmethod:第一个参数是类本身,通常写作cls。
因此:
- 静态方法更像挂在类名空间下的普通函数。
- 类方法更适合操作类级别状态或做工厂方法。
类变量和实例变量有什么区别?
- 类变量定义在类体中,由所有实例共享。
- 实例变量属于对象本身,不同实例彼此独立。
如果实例上定义了同名属性,会屏蔽类变量的访问结果。
什么是 Python 自省(introspection)?
自省指程序在运行时检查对象类型、属性、方法等信息的能力。
常见函数或方法包括:
type()isinstance()dir()hasattr()getattr()
迭代器和生成器有什么区别?
- 迭代器实现了迭代协议,可以逐个返回元素。
- 生成器是一种更方便创建迭代器的方式,通常通过
yield实现。
生成器的优点是:
- 代码更简洁
- 惰性求值
- 更省内存
*args 和 **kwargs 分别是什么?
*args:接收位置参数,得到一个元组。**kwargs:接收关键字参数,得到一个字典。
它们用于让函数支持可变参数。
什么是装饰器?
装饰器本质上是一个接收函数并返回新函数的语法糖,用来在不修改原函数代码的前提下增强其行为。
典型用途:
- 日志
- 权限控制
- 缓存
- 性能统计
什么是鸭子类型?
鸭子类型强调的是对象“是否具备所需行为”,而不是“是否属于某个特定类型”。
也就是:
- 不关心你是什么类
- 只关心你能不能完成我要的动作
这符合 Python 的动态语言特性。
__new__ 和 __init__ 的区别是什么?
__new__:负责创建并返回实例对象。__init__:在对象创建完成后负责初始化。
如果需要控制对象创建过程,比如实现不可变对象或单例,通常会更关注 __new__。
如何实现单例模式?
常见方式包括:
- 重写
__new__ - 装饰器
- 模块天然单例
- 元类控制
Python 中模块级天然缓存已经能解决很多“单例”场景。
Python 的作用域规则是什么?
通常遵循 LEGB:
LocalEnclosingGlobalBuilt-in
变量查找会按这个顺序进行。
什么是 GIL?
GIL 是 CPython 中的全局解释器锁。
它的影响是:
- 同一时刻只有一个线程执行 Python 字节码。
因此:
- CPU 密集型场景下,多线程不一定能利用多核。
- I/O 密集型场景下,多线程仍然有价值。
什么是协程?
协程是用户态的轻量级并发单元,适合高并发 I/O 场景。
Python 中常见实现:
yieldasync/awaitasyncio
Python 的垃圾回收机制是什么?
Python 的垃圾回收主要包括:
- 引用计数
- 标记清除
- 分代回收
引用计数解决大多数对象回收问题,循环引用则需要额外的 GC 机制处理。
is 和 == 的区别是什么?
==:比较值是否相等。is:比较是否是同一个对象。
所以:
- 值相等不一定
is为真。 is更强调对象身份。
Python 2 和 Python 3 的主要区别有哪些?
高频差异包括:
print:语句变函数- 字符串与编码处理差异更明显
range行为变化- 整数除法语义变化
- 标准库命名与结构调整
现在实际项目基本优先 Python 3。
Python 和多线程适合一起用吗?
要分场景:
- I/O 密集型:适合
- CPU 密集型:通常不理想
CPU 密集型更常见替代方案:
- 多进程
- C 扩展
- NumPy / 向量化
- 分布式任务框架
WSGI 是什么?和 FastCGI 有什么关系?
WSGI是 Python Web 应用和服务器之间的接口规范。FastCGI是一种更底层的通信协议。
两者不在同一层级:
- WSGI 定义 Python 应用如何与 Web Server/网关对接。
- FastCGI 定义进程间如何高效通信。
Django 和 Tornado 有什么区别?
- Django:大而全,适合快速开发完整 Web 应用。
- Tornado:更偏异步和高并发网络服务。
一般理解:
- Django 更偏“完整框架”
- Tornado 更偏“事件驱动网络框架”
如何做 Django 单元测试?
常见做法:
- 使用
django.test.TestCase - 为模型、视图、接口、表单分别编写测试
- 利用测试数据库隔离环境
核心目标是验证业务逻辑、接口行为和回归稳定性。
如何去重列表中的重复元素?
常见做法:
set()去重- 保序去重可结合循环和哈希表
例如保序:
seen = set()
result = []
for x in data:
if x not in seen:
seen.add(x)
result.append(x)如何实现二分查找和快速排序?
这两道都是 Python 面试高频算法题:
- 二分查找:用于有序数组,时间复杂度
O(log n) - 快速排序:分治思想,平均时间复杂度
O(n log n)
回答时重点是:
- 二分的边界处理
- 快排的分区过程
评论
使用 GitHub 账号即可参与加载较慢?可 直接前往 GitHub Discussions 查看与参与。