Python面试题
一、基础语法与数据类型1. 列表list和元组tuple的核心区别可变性列表可变元组不可变。适用场景列表用于存储顺序数据元组用于存储结构化数据。性能元组内存占用更小访问速度更快。2. “is”和“”的区别is判断两个变量是否指向同一对象内存地址相同。判断两个对象的值是否相等。3. Python 如何实现字符串插值f-stringprint(f’Hello {name})。% 运算符print(‘Hey %s’ % name)。format 方法print(‘My name is {}’.format(name))。4. 交换两个变量的值有几种方式Python 特有语法a, b b, a推荐简洁高效。临时变量法temp a; a b; b temp通用但冗余。5. Range 函数的用法range(stop)生成 0 到 stop-1 的整数如 list(range(3)) 结果为 [0, 1, 2]。range(start, stop)生成 start 到 stop-1 的整数如 list(range(2, 5)) 结果为 [2, 3, 4]。range(start, stop, step)以 step 为步长生成整数如 list(range(1, 10, 2)) 结果为 [1, 3, 5, 7, 9]。6. 什么是 lambda 函数适用场景定义单行匿名函数语法为 lambda 参数: 表达式。场景适用于简单函数如作为 sort() 的 key 参数。7. 如何在 Python 中递增和递减整数递增num 1 或 num num 1。递减num - 1 或 num num - 1。8. 如何删除列表中的重复元素排序后扫描法先排序列表再从后向前扫描删除重复元素。集合转换法利用集合的唯一性如 list(set(lst))但会丢失原始顺序。9. Python 中如何定义函数语法def 函数名(参数): 函数体。注意函数必须先定义后调用支持嵌套定义函数。10. 函数 func 和 func() 的区别func表示函数对象可赋值给变量或作为参数传递。func()调用函数执行函数体并返回结果。二、内存管理与操作类题目1. Python 如何进行内存管理从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制一、对象的引用计数机制**Python内部使用引用计数来保持追踪内存中的对象所有对象都有引用计数。引用计数增加的情况1一个对象分配一个新名称2将其放入一个容器中如列表、元组或字典引用计数减少的情况1使用del语句对对象别名显示的销毁2引用超出作用域或被重新赋值sys.getrefcount( )函数可以获得对象的当前引用计数多数情况下引用计数比你猜测得要大得多。对于不可变数据如数字和字符串解释器会在程序的不同部分共享内存以便节约内存。二、垃圾回收1当一个对象的引用计数归零时它将被垃圾收集机制处理掉。2当两个对象a和b相互引用时del语句可以减少a和b的引用计数并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用因此引用计数不会归零对象也不会销毁。从而导致内存泄露。为解决这一问题解释器会定期执行一个循环检测器搜索不可访问对象的循环并删除它们。三、内存池机制Python提供了对内存的垃圾收集机制但是它将不用的内存放到内存池而不是返回给操作系统。1Pymalloc机制。为了加速Python的执行效率Python引入了一个内存池机制用于管理对小块内存的申请和释放。2Python中所有小于256个字节的对象都使用pymalloc实现的分配器而大的对象则使用系统的malloc。3对于Python对象如整数浮点数和List都有其独立的私有内存池对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数用于缓存这些整数的内存就不能再分配给浮点数。2. 如何反序迭代一个序列列表list.reverse() 后遍历最后恢复- 原列表。通用序列使用 range(len(seq)-1, -1, -1) 反向索引遍历。3. 如何实现 tuple 和 list 的转换list 转 tupletuple(list)如 tuple([1, 2, 3]) 结果为 (1, 2, 3)。tuple 转 listlist(tuple)如 list((1, 2, 3)) 结果为 [1, 2, 3]。4. 如何拷贝一个 Python 对象浅拷贝copy.copy() 或对象的 copy() 方法如字典的 dict.copy()。深拷贝copy.deepcopy()递归复制所有子对象。5. 如何删除一个文件使用 os.remove(filename) 或 os.unlink(filename)。6. 如何拷贝一个文件使用 shutil.copyfile(src, dst) 实现文件内容拷贝。7. 如何生成随机数使用 random 模块如 random.random() 生成 0 到 1 之间的浮点数。8. 如何发送邮件使用 smtplib 标准库配置 SMTP 服务器调用 sendmail() 方法发送邮件。9. 如何设置全局变量在函数内部使用 global 关键字声明变量如deff():globalx x1010. 如何查询和替换文本字符串使用 re.sub() 方法语法为 re.sub(pattern, replacement, string)。三、文件与 IO 操作1. read、readline、readlines 的区别2. 如何查看目录下的所有文件使用 os.listdir(‘.’)返回当前目录下的文件和文件夹列表。3. json 序列化时如何保留中文使用 json.dumps() 的 ensure_asciiFalse 参数如importjson json.dumps({name:张三},ensure_asciiFalse)# 输出 {name: 张三}4. 如何合并两个文件的内容并按字母顺序输出分别读取两个文件的内容合并后排序写入新文件。示例代码withopen(A.txt,r)asf1,open(B.txt,r)asf2:contentf1.read().strip()f2.read().strip()sorted_content.join(sorted(content))withopen(C.txt,w)asf:f.write(sorted_content)四、面向对象编程1. 如何实现单例模式元类方式通过元类的call方法控制实例创建。装饰器方式使用装饰器缓存实例确保全局唯一。2. 实例方法、静态方法、类方法的区别1. 定义一个 Car 类包含 color 和 speed 属性并返回 speed。classCar:def__init__(self,color,speed):self.colorcolor self.speedspeed carCar(red,100mph)print(car.speed)# 输出 100mph五、装饰器与高级特性1. 什么是装饰器定义装饰器是一个函数用于在不修改原函数代码的前提下动态添加额外功能。示例日志记录装饰器在函数调用前后打印日志。2. 如何实现带参数的装饰器通过三层嵌套函数实现外层接收参数中层接收被装饰函数内层执行装饰逻辑。3. 什么是闭包内部函数引用外部函数的局部变量且外部函数返回内部函数形成闭合的作用域。六、正则与字符串处理1. match() 和 search() 的区别match()仅从字符串开头匹配匹配成功返回匹配对象否则返回 None。search()扫描整个字符串返回第一个匹配到的对象。2. 正则中 . 和 .? 的区别.*贪心匹配匹配最长的符合条件的字符串。.*?非贪心匹配匹配最短的符合条件的字符串。七、数据结构与算法1. 如何用栈实现队列使用双栈法一个栈用于入队另一个栈用于出队当出队栈为空时将入队栈的元素全部弹出并压入出队栈。2. 最长递增子序列LIS的优化解法使用二分查找维护候选序列时间复杂度 O(nlogn)。示例代码importbisectdeflength_of_LIS(nums):tails[]fornuminnums:idxbisect.bisect_left(tails,num)ifidxlen(tails):tails.append(num)else:tails[idx]numreturnlen(tails)八、并发与系统设计1. 如何实现生产者-消费者模型使用 queue.PriorityQueue 实现线程安全的队列生产者入队消费者出队配合 task_done() 和 join() 控制任务完成。2. 如何定位内存泄漏使用 objgraph 工具通过 show_growth() 对比对象增长show_backrefs() 查看引用链定位循环引用。3. Python 3.10 的模式匹配match-case如何使用用于处理嵌套数据结构比传统 if-else 更清晰。示例代码defhandle_response(response):matchresponse:case{status:200,data:{user:str(name),age:int(age)}}:returnfUser{name}, age{age}case{status:404,message:msg}:returnfError:{msg}case_:returnUnknown response format九、调试与工具链1. 有哪些 Python 代码分析工具PyChecker静态分析工具查找代码 bug检查复杂度和格式。Pylint代码规范检查工具遵循 PEP8 等编码标准。2. 如何调试 Python 程序pdb命令行调试工具支持断点、单步执行。IDE 断点调试如 PyCharm可视化设置断点和查看变量。日志打印使用 logging 模块记录程序运行信息。十、实战与场景题1. 如何统计文件中单词频率逐行读取文件用 split() 分割单词collections.Counter 统计频率。2. 如何优化字符串拼接性能使用 join() 方法避免使用 拼接减少内存分配次数。3. 如何监控服务器磁盘空间调用 df -h 命令解析输出结果判断剩余空间是否低于阈值触发告警。4. 如何生成安全随机密码使用 secrets 模块的 token_urlsafe() 方法避免使用 random 模块生成密码。5. 如何用 Python 发送邮件使用 smtplib 库配置 SMTP 服务器构建邮件内容调用 sendmail() 方法发送。6. 如何合并两个文件的内容并按字母顺序输出读取两个文件内容合并后排序写入新文件。十一、开放性与综合题1. Python 适合哪些领域的开发Web 开发、数据分析、AI、自动化运维、爬虫等领域因丰富的库和简洁语法而广泛应用。2. 设计一个缓存系统需要考虑哪些因素缓存淘汰策略如 LRU、过期时间、持久化、并发安全、内存限制等。3. 如何反转链表迭代法使用三个指针 prev、current、next_node依次反转节点指向时间复杂度 O(n)。4. Python 中如何实现类型转换int()将字符串或浮点数转为整数。float()将整数或字符串转为浮点数。str()将数字转为字符串。5. Python 的整数缓存机制是怎样的Python 对 -5 到 256 的整数进行缓存相同值的整数变量指向同一内存地址如 a 256; b 256; a is b 为 True而 a 257; b 257; a is b 可能为 False。