面试题 / Python

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__

如何实现单例模式?

常见方式包括:

  1. 重写 __new__
  2. 装饰器
  3. 模块天然单例
  4. 元类控制

Python 中模块级天然缓存已经能解决很多“单例”场景。

Python 的作用域规则是什么?

通常遵循 LEGB

  • Local
  • Enclosing
  • Global
  • Built-in

变量查找会按这个顺序进行。

什么是 GIL?

GIL 是 CPython 中的全局解释器锁。

它的影响是:

  • 同一时刻只有一个线程执行 Python 字节码。

因此:

  • CPU 密集型场景下,多线程不一定能利用多核。
  • I/O 密集型场景下,多线程仍然有价值。

什么是协程?

协程是用户态的轻量级并发单元,适合高并发 I/O 场景。

Python 中常见实现:

  • yield
  • async/await
  • asyncio

Python 的垃圾回收机制是什么?

Python 的垃圾回收主要包括:

  1. 引用计数
  2. 标记清除
  3. 分代回收

引用计数解决大多数对象回收问题,循环引用则需要额外的 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
  • 为模型、视图、接口、表单分别编写测试
  • 利用测试数据库隔离环境

核心目标是验证业务逻辑、接口行为和回归稳定性。

如何去重列表中的重复元素?

常见做法:

  1. set() 去重
  2. 保序去重可结合循环和哈希表

例如保序:

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)

回答时重点是:

  • 二分的边界处理
  • 快排的分区过程

来源引用