Python 面试系列:常见 100 个经典面试问题,从入门到进阶,再到实战(一))
Python 面试系列常见 100 个经典面试问题从入门到进阶无论你是刚刚开始接触 Python还是已经用它在生产环境中搭建了复杂的系统面试中的灵魂拷问永远不会缺席。本文梳理了 100 道经典 Python 面试题按基础、进阶、高级、实战四个阶段展开每道题都附有精要解答帮你查漏补缺构建完整的知识图谱。虽然现在是 AI编程但是你不懂基础面试题你连上班使用AI的入场券都没有。第一部分基础篇1–25万丈高楼平地起这是每一场 Python 面试都必须稳拿的分。1. Python 的主要特点有哪些解释型、动态类型、强类型、面向对象、丰富的标准库、跨平台。语法简洁强制缩进。2. 列表和元组有什么区别列表可变[]元组不可变()。元组可作为字典键列表不可以。元组内存更小、创建更快。3. Python 的字典是如何实现的基于哈希表键必须是可哈希的。查找、插入和删除的平均时间复杂度为 O(1)。4. 什么是可变类型与不可变类型举例。可变list, dict, set不可变int, float, str, tuple, frozenset。修改不可变对象会创建新对象。5.is与的区别是什么比较值是否相等is比较两个对象的内存地址是否相同即是否为同一个对象。6. 深拷贝与浅拷贝的区别浅拷贝copy.copy()只复制对象本身内部子对象仍是引用深拷贝copy.deepcopy()递归复制所有子对象完全独立。7.*args和**kwargs的作用*args接收任意数量的位置参数打包为元组**kwargs接收任意数量的关键字参数打包为字典。8. 什么是列表推导式举例。生成列表的简洁语法[x**2 for x in range(10) if x % 2 0]。9.lambda函数是什么匿名函数用一行表达式定义简单功能如lambda x: x 1。10. 注释方式有哪些文档字符串怎么用单行用#多行用三引号...或...。函数/类内首行字符串是 docstring可通过__doc__访问。11. Python 的基本数据类型有哪些整数、浮点数、复数、布尔、字符串、列表、元组、字典、集合、NoneType。12. 字符串格式化方式有哪些%格式化、str.format()、f-string (Python 3.6)推荐 f-stringfname: {name}。13. 如何交换两个变量的值a, b b, a利用元组打包与解包。14.pass语句的作用占位符什么也不做用于语法上需要但逻辑上无操作的场景。15.range()的用法和xrange的区别range(stop)、range(start, stop, step)。Python 3 的range是懒加载的迭代器类似 Python 2 的xrangePython 2 的range返回列表。16. 如何读取文件文件打开模式有哪些with open(file.txt, r) as f: content f.read()。模式r读w覆盖写a追加rb/wb二进制支持读写。17. 异常处理try/except/finally的用法try捕获异常except处理else无异常时执行finally无论是否异常都执行常用于清理资源。18. 全局变量与局部变量global和nonlocal关键字。函数内赋值视为局部变量。修改全局变量用global嵌套函数中修改外层函数的局部变量用nonlocal。19. 如何将字符串转为整数反之int(123)str(123)浮点数用float()。20.append()和extend()的区别append(x)把元素 x 作为一个整体追加到列表末尾extend(iterable)将可迭代对象的每个元素逐一追加。21.enumerate()和zip()的用法enumerate(lst)返回(index, value)序列zip(a, b)打包多个可迭代对象按最短的截断。22. 如何随机化列表import random; random.shuffle(lst)原地打乱random.sample(lst, n)随机采样不改变原列表。23.None是什么类型如何判断变量是否为NoneNoneType 的单例对象表示空值。用x is None判断而不是。24. 下划线_在 Python 中的惯例单下划线_var表示受保护/内部使用双下划线__var触发名称改写双前后下划线__var__为魔术方法单独_表示最近一次表达式的结果。25.__name__ __main__的作用当脚本作为程序入口运行时__name__被设为__main__以便执行测试或启动代码作为模块被导入时不执行该块。第二部分进阶篇26–50掌握了基础这里开始考察你能否写出优雅、Pythonic 的代码。26. 装饰器的原理写一个计时装饰器。装饰器是一个接收函数、返回新函数的高阶函数用于增强行为。importtimedeftimer(func):defwrapper(*args,**kwargs):starttime.time()resultfunc(*args,**kwargs)print(fElapsed:{time.time()-start:.4f}s)returnresultreturnwrapper27. 什么是闭包应用场景。内部函数引用了外部函数的变量即使外部函数已返回这些变量依然存活的机制。常用于工厂函数、装饰器、数据隐藏。28. 迭代器与可迭代对象有什么区别可迭代对象实现了__iter__()返回迭代器迭代器实现了__next__()并维护遍历状态。迭代器一定是可迭代对象。29. 生成器与yield的用法和列表推导式的区别生成器是惰性求值通过yield逐次返回值内存占用小。列表推导式一次性生成所有元素。生成器表达式用圆括号(...)。30.map(),filter(),reduce()怎么用map(fn, iterable)对每个元素应用函数filter(pred, iterable)筛选真值元素reduce(fn, iterable)从functools导入累积计算。31. 类变量与实例变量的区别类变量在类体中定义所有实例共享实例变量在__init__中通过self定义各实例独立拥有。32.__init__和__new__的区别__new__是构造方法创建并返回实例对象__init__是初始化方法初始化实例属性。__new__先于__init__调用。33.staticmethod,classmethod和普通方法的区别普通方法接收self实例类方法接收cls类本身静态方法不接收隐含参数与普通函数类似但组织在类里。34. 如何实现单例模式重写__new__使类只创建一次实例或使用模块模块本身就是单例、装饰器、元类等。35.property装饰器的作用将方法封装为属性支持 getter/setter/deleter保持封装性的同时提供简洁的访问接口。36. Python 的访问修饰符约定_protected受保护__private私有名称改写_ClassName__attr实质上没有真正的私有。37. 方法解析顺序 MRO 是什么多继承时查找属性和方法的顺序。Python 使用 C3 线性化算法可通过ClassName.__mro__查看。38.super()的用法返回代理对象按 MRO 调用父类方法。super().__init__()可以避免硬编码父类名合理处理多继承。39. 什么是元类使用场景。用于创建类的类默认是type。可以在类被创建时动态修改其属性、方法。常用于 ORM、API 框架、注册模式。40. 上下文管理器与with语句如何自定义实现__enter__和__exit__方法或使用contextlib.contextmanager装饰生成器确保资源被安全释放。41. 如何自定义异常继承Exception或其子类定义新的异常类型可添加自定义属性和方法。42. 模块与包的区别__init__.py的作用模块是单个.py文件包是包含__init__.py的目录用于组织模块。__init__.py标识包可包含初始化代码。43. Python 的导入机制绝对导入与相对导入。绝对导入从项目根路径开始from pkg.module import fn相对导入用.表示当前包from . import sibling。推荐绝对导入。44. 什么是“猴子补丁”在运行时动态修改模块、类或函数的行为常用于测试 mock 或给第三方库打补丁。45.pickle和json的区别pickle序列化 Python 对象包括自定义类但不安全、不可读、语言无关性差json生成文本跨语言只能序列化基本类型。46.collections模块常用数据结构。namedtuple具名元组deque双端队列Counter计数器OrderedDict有序字典3.7 dict 已保序defaultdict带默认值的字典。47.itertools模块常用函数。chain串联迭代器cycle无限循环groupby分组permutations/combinations排列组合islice惰性切片。48.functools模块常用工具。lru_cache缓存函数结果partial偏函数固定部分参数wraps装饰器复制元数据。49. 正则表达式re模块基本用法。re.search()搜索第一个匹配re.match()从开头匹配re.findall()返回所有匹配列表re.sub()替换。50. 时间与日期处理。datetime.datetime.now()获取当前时间timedelta做时间加减pytz/zoneinfo处理时区。这 50 道题覆盖了 Python 开发者需要掌握的绝大部分知识域。关注我下期继续分享剩余的50道。