Python 工程师常见基础面试题
本文整理了 Python 开发岗位面试中高频出现的三十个基础问题,涵盖语言特性、数据结构、内存管理、并发编程及设计模式等核心知识点。以下内容旨在帮助开发者系统复习 Python 基础知识,提升技术面试通过率。
Python 工程师常见基础面试题涵盖了语言特性、数据结构、内存管理、并发编程及设计模式等核心知识点。内容包含解释器类型、PEP8 规范、面向对象三大特性、可变与不可变数据类型辨析、迭代器与生成器区别、字典操作、多线程与多进程差异、HTTP 状态码、猴子补丁、垃圾回收机制、位运算符、二分查找实现、lambda 表达式、反射机制、列表去重方法、魔术函数、单例模式实现、自省方法、爬虫步骤、反爬虫策略、元组列表转换、日期获取及装饰器作用等三十个关键问题及其解答。

本文整理了 Python 开发岗位面试中高频出现的三十个基础问题,涵盖语言特性、数据结构、内存管理、并发编程及设计模式等核心知识点。以下内容旨在帮助开发者系统复习 Python 基础知识,提升技术面试通过率。
Python 是一门动态解释性的强类型定义语言。编写代码时无需预先定义变量类型,但在运行时变量类型会被强制固定,且无需编译成二进制文件,直接在解释器环境中运行源代码即可。
主要优点包括:
PEP 是 Python Enhancement Proposal(Python 增强建议书)的缩写。PEP8 特指其中关于代码风格规范的文档,它定义了让 Python 代码更易读、更统一的编码标准。遵循 PEP8 规范有助于团队协作时保持代码风格一致,减少因格式差异导致的审查成本。
Python 作为解释型语言,依赖解释器执行。常见的解释器有以下几种:
python 启动的即为 CPython。它是使用最广泛的标准实现。__var)将属性设为私有。好处包括隔离变化、便于维护、提高复用性和安全性。Python 内置了多种数据类型,主要包括以下八种:
判断依据是变量所指向的内存地址中的值是否可被修改。
Python 内置了丰富的异常体系,常见标准异常包括:
生成器是一种特殊的迭代器。生成器能完成迭代器的所有功能,但通过 yield 关键字自动生成 __iter__() 和 next() 方法,代码更简洁高效。使用生成器表达式替代列表解析可节省大量内存。当生成器执行完毕时,会自动抛出 StopIteration 异常。
iter() 转换为迭代器。字典是 Python 中最常用的数据结构之一,用于存储具有映射关系的数据。它是一种可变容器模型,由键(key)值(value)对组成,也称为关联数组或哈希表。
{key1: value1, key2: value2}。dict[key] 访问,若键不存在会抛出 KeyError。核心差异:在多进程中,同一变量每个进程有一份拷贝;多线程中所有线程共享同一份变量。由于 GIL(全局解释器锁)的存在,Python 多线程在 CPU 密集型任务中优势有限,多进程更适合 CPU 密集型,多线程适合 I/O 密集型。
HTTP 状态码是服务器返回给客户端的三位数字代码,表示请求的处理结果。主要分为五类:
猴子补丁(Monkey Patching)是指在运行时动态修改类、模块或函数的行为。常用于在不修改源码的情况下修复 Bug 或添加功能。它仅在内存中生效,不影响原始源码文件,且只对当前运行的程序实例有效。需谨慎使用,以免破坏代码的可预测性。
Python 的内存管理主要依赖引用计数,辅以标记清除和分代回收。
二分查找适用于有序数组,时间复杂度 O(log n)。
循环方式:
def binary_search_iterative(alist, item):
"""二分查找---循环版本"""
first = 0
last = len(alist) - 1
while first <= last:
mid = (first + last) // 2
if alist[mid] == item:
return True
elif item < alist[mid]:
last = mid - 1
else:
first = mid + 1
return False
if __name__ == "__main__":
a = [1, 5, 6, 10, 11, 13, 18, 37, 99]
print(binary_search_iterative(a, 18)) # True
print(binary_search_iterative(a, 77)) # False
递归方式:
def binary_search_recursive(alist, item):
"""二分查找---递归实现"""
n = len(alist)
if n > 0:
mid = n // 2
if item == alist[mid]:
return True
elif item < alist[mid]:
return binary_search_recursive(alist[:mid], item)
else:
return binary_search_recursive(alist[mid+1:], item)
else:
return False
if __name__ == "__main__":
a = [1, 5, 6, 10, 11, 13, 18, 37, 99]
print(binary_search_recursive(a, 37)) # True
print(binary_search_recursive(a, 88)) # False
Lambda 表达式用于定义匿名函数,即没有具体名称的函数。其函数体只能包含一条表达式语句,返回值即为该表达式的结果。适用于需要简单函数但不想费神命名的场景,如传递给 map、filter 等高阶函数。
反射机制允许在运行时动态确定对象类型,并通过字符串调用对象的属性、方法或导入模块。这是一种基于字符串的事件驱动机制。Python 支持的反射函数包括:
getattr(obj, name):获取属性。setattr(obj, name, value):设置属性。delattr(obj, name):删除属性。eval(str):执行字符串表达式。exec(str):执行字符串代码块。importlib.import_module(name):动态导入模块。numList = [1, 1, 2, 3, 4, 5, 4]
print(list(set(numList)))
a = [1, 2, 4, 2, 4]
c = list(dict.fromkeys(a).keys())
__new__ 创造实例,__init__ 初始化实例。key 参数而非 lambda。自省(Reflection)指程序在运行时检查自身结构的能力。常用方法包括:
type():判断对象类型。dir():获取对象属性列表。help():查看文档说明。isinstance():判断是否为已知类型。issubclass():判断继承关系。hasattr():判断是否存在属性。getattr() / setattr():获取/设置属性。id():获取内存地址。callable():判断是否可调用。list(tuple_obj)tuple(list_obj)
两者均为内置构造函数,转换过程快速且安全。__call__ 使得对象实例可以像函数一样被调用。常用于实现类装饰器或回调对象。
class Bar:
def __init__(self, p1):
self.p1 = p1
def __call__(self, func):
def wrapper():
print("Starting", func.__name__)
print("p1=", self.p1)
func()
print("Ending", func.__name__)
return wrapper
@Bar("foo bar")
def hello():
print("Hello")
使用 datetime 模块:
import datetime
print(datetime.datetime.now())
装饰器本质上是一个高阶函数,用于在不修改原函数代码的前提下增加额外功能。常用于日志记录、性能测试、事务处理、缓存、权限校验等切面场景。它通过闭包机制抽离通用逻辑,提高代码复用率。
以上三十个问题涵盖了 Python 基础面试的核心考点,建议结合代码实践深入理解。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online