很多人在简历里写了“精通Python”,等到面试官一问就慌了。心里知道简历有点虚,但更怕被戳穿。别着急,你不是一个人。大部分人写精通Python,其实就是会写个爬虫、调个库、跑个脚本。真问到底层细节,脑子容易空白。
今天这20个面试题,全是重点。你不用每个都背下来,知道怎么聊就行。面试官要的不是正确答案,而是你有没有编程的感觉。
1. 列表和元组的根本区别是什么?
一个在面试前想清楚。列表可变,元组不可变。有人会背这个结论,但不懂应用场景。你写代码时定义一个坐标,肯定用元组。因为坐标点改不了更安全。数据要去重时用集合,要保留顺序用列表。聊到这个,你说“列表可变靠的是内存里连续的空间,改变长度时内存地址可能变,元组一开始就定死大小了”,面试官会觉得你懂行。
2. 深拷贝和浅拷贝你真的会用吗?
浅拷贝只复制一层,深拷贝复制所有。你看过代码报错吗?有人用浅拷贝改了嵌套列表里的元素,原数据也被改,debug到崩溃。这时候你该说“我遇到过,后来发现用copy.deepcopy就解决了”。面试官就喜欢这种带真实经验的回答。
3. 字典怎么保证键的唯一性?
字典用哈希表。你不需要说哈希表原理,但要知道键必须是不可变类型。字符串、数字、元组能当键。列表不行。面试官问这个,你可以笑笑说“我试过把列表当键,直接报错了,后来改用了字符串”。
4. 生成器和迭代器有什么区别?
迭代器是通用概念,生成器是具体实现。生成器用yield,每次调用返回一个值,内存不爆炸。你处理大文件时用生成器,一行一行读,不用一次性塞爆内存。你直接说“我处理过10GB的日志,一次readlines全读了,电脑直接卡死,后来用生成器一行一行读就没事了”,面试官就知道你不是光背书。
5. 闭包到底是怎么回事?
闭包就是函数里再定义函数,内部函数能用到外层函数的变量。这个用途很多,比如写装饰器。你这样说“闭包就是在一个函数内存住另一个函数的变量,不会丢”。讲清楚就行。
6. 装饰器怎么用?
装饰器给函数加功能,不影响原函数。面试官常问“登录验证只能用装饰器写”。你回答“我写过日志装饰器,每个函数调用前自动记录时间,不用在每个函数里加重复代码”。你一旦说出实际场景,面试官就知道你不是死记硬背。
7. 全局解释器锁GIL是什么?
面试必问。GIL让一个时间只有一个线程在跑Python代码。很多Python新手不知道这个。你可以说“GIL是个锁,多线程算CPU重型任务时反而不如单线程快,IO任务才适合用多线程。真要并行计算得用多进程”。这种话一说出来,面试官会把你归到中高级。
8. 上下文管理器用过吗?
就是with open语句。你这不只是会用文件,还可以自定义。比如连接数据库,你可以写个上下文管理器,进入时连数据库,退出时自动关闭连接。你说“我写了个数据库上下文管理器,每次数据库操作都不会忘了关闭连接”,面试官就知道你不会写泄露代码。
9. 可变对象和不可变对象怎么用?
不可变是整数、字符串、元组。可变是列表、字典、集合。默认参数一定要小心。如果你写def func(lst=[]),这个空列表只会创建一次。你再调用就会累积数据。你可以说“我踩过这个坑,后来改成def func(lst=None),每次新创建一个列表”。
10. 匿名函数lambda在什么时候用?
简单函数用lambda,一句能写完。比如排序时用sort(key=lambda x:x[1])。面试官问你就说“lambda用在简单操作,复杂逻辑还是要用def,不然别人看不懂代码”。
11. map、filter、reduce熟悉吗?
这几个函数用来操作序列。map干遍历,filter干筛选,reduce干累积。现在很多人用列表推导式替代它们,但面试官还问。你回答“我用列表推导式多一些,可读性更好。但map配合lambda做批量处理也挺利索”。
12. 异常处理怎么才能写好?
有人try一大块代码,异常类型都不写,全用Exception。那是不对的。你要精确捕获。比如读文件,指定FileNotFoundError。你还可以用else和finally。你直接说“我习惯每个异常都指定类型,空异常捕获会让bug更难找”。面试官会点头。
13. 字符串格式化你用哪种?
现在推荐f-string。美观高效。%格式化是祖辈,format是中辈,f是当代。你说“我现在都用f{l'{变量名}'},简洁明了”。面试官就喜欢你用现代写法。
14. __init__和__new__谁先执行?
__new__先执行,创建对象实例。__init__后执行,初始化属性。有人分不清。你说“__new__是造房子框架,__init__是装修。单例模式一般重写__new__”。面试官会高看你一眼。
15. 推导式用得多吗?
列表推导式、字典推导式、集合推导式。比循环快一点点。用一次推导式能写出几行循环做的事。你说“列表推导式我天天用,但三层推导式就算了,写出来别人想打我”。面试官会笑。
16. 协程和线程选哪个?
协程是用户态线程,切换不靠操作系统。线程是操作系统级别的。处理大量IO请求时协程好,比如爬虫。有人说“我用协程爬过一万个网页,同样的机器线程的话会挂”。面试官想听的就是这种。
17. 列表去重有几种办法?
第一用set,简单粗暴。第二新建列表遍历判断。第三用字典fromkeys。你还可以说“我用set去重后,有时还想保留顺序,那就用字典加列表推导式”。面试官喜欢你知道细节。
18. 类型注解真的用吗?
很多人装了类型注解写起来麻烦。但大项目必须用。你说“写小脚本不用,写给别人看的代码必须用。别人一看函数签名就知道要传什么值”。
19. 模块导入循环了怎么办?
A导B,B导A,就会报错。解决办法是把公共部分抽到另一个模块里。或者延迟导入。你说“干过这事,直接在函数内部import,虽然不优雅但能快速解决问题”。面试官知道你懂实战。
20. 你平时怎么调试代码?
有人依赖print,有人用logging,有人用pdb。你说“print不能删除,我习惯用logging加上不同级别,上线后改个日志等级就能排查问题。实在复杂的bug才用pdb一步步走”。面试官就喜欢知道你有工程思维。
别把面试看得太可怕。你只要把这些题想通,结合你自己的真实经历去聊,说话有底气,面试官就能接受。你简历写精通Python,现在你心里应该不虚了。吃透这20个点,面试绝对不抖。