(python面试题)快速全面掌握python(必背)——60道python面试题及详细答案(二)¶
本文讨论了60道Python面试题及详细答案,涵盖核心语法、面向对象、数据结构等多方面内容,旨在帮助读者快速全面掌握Python以应对面试。关键要点包括:
Python 概述:语法简洁、可读性强、开发效率高,生态丰富,应用广泛,学习曲线平缓,Python 3 是主流版本。
GIL 与并发:CPython 有 GIL,影响 CPU 密集型多线程并行,可通过多进程等绕过,asyncio 用于异步 IO。
数据结构:列表有序可变,元组有序不可变,字典键值对存储,集合存储不重复元素,字典键须为不可变类型。
面向对象:用 class 定义类,支持继承和多态,@classmethod 和 @staticmethod 有不同用途。
异常与回收:使用 try/except/else/finally 处理异常,通过引用计数、标记 - 清除和分代回收管理对象生命周期。
性能与部署:可从算法、数据结构、使用内置库等方面提升性能,用虚拟环境管理依赖,通过setuptools等打包发布。
其他要点:还有装饰器、迭代器、生成器、上下文管理器等概念,以及文件读写、网络请求、单元测试等操作。
以下是精心整理的60道Python相关面试题及其参考答案。这些问题涵盖了Python的核心语法、面向对象、数据结构、异常处理、并发编程、常用库与框架、部署、性能优化等多个方面。
1. 请简要介绍一下你对 Python 的理解,以及它为什么如此流行?¶
答:¶
语言特性:Python 语法简洁、可读性强、开发效率高,适合快速开发原型和进行脚本自动化。
生态与社区:拥有庞大的第三方库生态(如数据分析、机器学习、Web开发、自动化运维等),社区活跃,新手友好,出现问题时易于找到解决方案。
应用领域:广泛应用于 Web 后端开发(Django、Flask)、数据分析与可视化(Pandas、Matplotlib)、人工智能与机器学习(TensorFlow、PyTorch)、网络爬虫、自动化运维等。
学习曲线平缓:相较于 C++、Java 等语言,Python 更容易上手,并在快速开发和迭代方面具有很大优势。
2. Python 2 和 Python 3 有何主要区别?现在应该使用哪个版本?¶
答:¶
主要区别:
选择:目前绝大多数场景都使用 Python 3,尤其是 Python 3.9、3.10、3.11 等最新稳定版本。
3. Python 中的 GIL(Global Interpreter Lock)是什么?会带来什么影响?¶
答:¶
定义:在 CPython 实现中,为了保证线程安全,只有一个线程能够在同一时刻执行 Python 解释器的字节码,这把锁被称为全局解释器锁。
影响:
4. 谈谈 Python 中常见的数据结构:列表(list)、元组(tuple)、字典(dict)、集合(set)分别有什么特点?¶
答:
列表(list):有序、可变,可通过索引访问和切片操作,常用方法有 append(), insert(), pop(), remove() 等。
元组(tuple):有序、不可变,常用来保存不可变的数据或做函数返回多个值。元组的修改操作非常有限。
字典(dict):键值对存储,无序(Python 3.7+ 中字典默认保持插入顺序,但本质是哈希表结构),查找和插入速度快。键必须是不可变类型(如字符串、元组)。
集合(set):存储不重复元素,无序;常用于去重或集合运算(并集、交集、差集),底层也是哈希表。
5. 可变类型与不可变类型分别有哪些?为什么字典的键必须是不可变的?¶
答:
不可变类型:int, float, bool, str, tuple(若其内部也全是不可变对象)等;
可变类型:list, dict, set 等。
原因:字典键要求可哈希(hashable),哈希值在生命周期内不可变。可变对象若修改了内容,哈希值也会变,进而破坏字典结构。
6. is 和 == 在 Python 中有什么区别?¶
答:
== 比较的是 两个对象的值 是否相等;
is 比较的是 两个对象的引用 是否指向同一个内存地址;
在小整数缓存等特殊情形中,is 的结果可能会 “看似” 相同,但实际上应理解二者的根本区别。
7. 什么是深拷贝(deep copy)和浅拷贝(shallow copy)?在 Python 中如何实现?¶
答:¶
浅拷贝:复制了最外层对象,但内部的可变对象仍然与原对象共享引用;常用 copy.copy() 或 [:] 来实现。
深拷贝:会递归复制内部所有对象,生成完全独立的新对象;常用 copy.deepcopy() 来实现。
示例:
8. 请说明字符串( $ \text{str} $)为什么在 Python 中是不可变的?这样做有什么好处?¶
答:¶
原因:在 Python 设计中,字符串被定义为不可变对象,每次修改会生成新的字符串对象;
好处:
缺点:频繁拼接会浪费内存或导致性能下降,推荐使用 join() 或其他方式来合并大量字符串。
9. 如何用 Python 实现装饰器(decorator)?它的工作原理是什么?¶
答:¶
原理:装饰器本质是一个高阶函数,接收被装饰的函数作为参数并返回新函数,通过在函数定义前加@decorator来使用。
实现示例:
代码块
1 def my_decorator(func): 2 def wrapper(args, kwargs): 3 print("在函数执行前可以做一些事情") 4 result = func(args, **kwargs) 5 print("在函数执行后可以做一些事情") 6 return result 7 return wrapper 8 9 @my_decorator 10 def hello(): 11 print("Hello, world!") 12 13 hello()
用途:日志记录、鉴权、缓存、性能统计等 AOP(面向切面)场景。
10. 什么是列表推导式(List Comprehension)和生成器表达式(Generator Expression)?它们有什么区别?¶
答:
列表推导式:一次性生成所有元素并返回列表,例如 $ [x \times 2 \text{ for } x \text{ in range}(5)] $。
生成器表达式:使用小括号 (),返回一个生成器对象,按需惰性生成元素,如 $ (x \times 2 $ for x in range(5)) $。
区别:列表推导式会立即占用内存存储所有结果,而生成器表达式是惰性求值,能节省内存但只能迭代一次。
- Python 中如何定义函数的可变参数 args 和 *kwargs?它们分别解决什么问题?
答:
$ ^{*} $args:把可变数量的位置参数打包成一个元组;
代码块
1 def func(*args): 2 for arg in args: 3 print(arg)
**kwargs:把可变数量的关键字参数打包成一个字典;
代码块
1 def func(**kwargs): 2 for k, v in kwargs.items(): 3 print(k, v)
用途:在定义函数时不确定要传多少参数或需要更多灵活性时使用,装饰器或函数代理转发参数也经常用到这两种形式。
12. 说一下 Python 中的命名空间(namespace)和作用域(LEGB 原则)。¶
答:¶
命名空间:Python 用命名空间来存储变量名与对应对象之间的映射。常见有局部命名空间、全局命名空间和内置命名空间。
LEGB 搜索顺序:
解析变量名时会按照以上顺序逐层查找,若最终没找到则抛出 NameError。
13. 在 Python 中, $ \underline{\text{global}} $ 和 $ \underline{\text{nonlocal}} $ 关键字分别有什么作用?¶
答:¶
global:在函数内部声明全局变量,使得对该变量的赋值会影响到函数外部的同名全局变量;
nonlocal:在嵌套函数中声明外层函数的变量,使得对该变量的赋值会影响到外层函数作用域中的同名变量(但非全局)。
区别:global 直接作用于模块级别变量,nonlocal 只在多层嵌套函数内生效。
14. 什么是迭代器(Iterator)与生成器(Generator)?在 Python 中如何创建?¶
答:¶
迭代器:实现了 iter 和 next 方法的对象,可被 next() 调用依次取值。
生成器:一种特殊的迭代器,使用 yield 关键字来返回数据;函数被调用时返回一个生成器对象,可在执行中断后恢复状态。
创建生成器:
15. Python 的面向对象编程(OOP)实现方式是怎样的?如何实现继承和多态? 答:¶
类与对象:用 class 定义类,创建实例时调用类的构造方法 init。
继承:子类在定义时将父类放在括号中,如 class Child(Parent):,可以继续承父类的属性和方法。
多态:在子类中重写(override)父类同名方法,调用时根据实例的实际类型执行对应方法。Python是动态类型语言,只要对象实现同样的方法,就能被同样使用(“鸭子类型”)。
16. @classmethod 和 @staticmethod 有何区别?在什么场景下使用?¶
答:¶
@classmethod:第一个参数是 cls,表示类本身。类方法可以访问或修改类级别的属性,通常用于工厂方法或对类属性操作的需求。
@staticmethod:没有默认传入的 self 或 cls 参数,与普通函数类似,只是放在类的命名空间中便于组织,可在逻辑上与类关联但不依赖实例或类属性时使用。
- Python 中的异常处理机制是怎样的? try/except/else/finally 块各自干什么?
答:
结构:
try: 2 # 可能发生异常的代码 3 except SomeException as e: 4 # 异常处理 5 else: 6 # 如果没有发生异常则执行的代码 7 finally: 8 # 无论是否发生异常都要执行的收尾操作
作用:¶
18. 简述 Python 的垃圾回收机制(GC)。¶
答:¶
Python 主要通过引用计数 来管理对象生命周期,当引用计数变为 0 时对象立即被回收;
为解决循环引用等问题,还会配合标记-清除和分代回收机制定期扫描;
在 CPython 中,对象一旦引用计数为 0 就会立即回收,而不依赖下一次垃圾回收器的遍历。
19. Python 中线程和进程的区别是什么?在 CPU 密集任务下为什么更倾向于多进程?¶
答:¶
线程:共享进程地址空间,切换开销较小,但受 GIL 限制,在纯 Python 代码中无法进行多核并行(CPU 密集型任务收益有限)。
进程:拥有独立的内存空间,切换开销大,但可真正利用多核 CPU 并行。
CPU 密集任务:为绕过 GIL,让多核并行发挥作用,往往使用 multiprocessing 或分布式等方案。
20. Python 的 asyncio 是什么?如何使用 async 和 await?¶
答:¶
asyncio:Python 标准库中的异步 IO 框架,基于事件循环和协程,可在单线程内处理大量并发的 I/O 操作。
async:用在函数定义前,声明该函数为异步协程函数(如 async def func(): ...)。
await:在协程函数内部,等待另一个协程或可等待对象(如 asyncio.sleep(1))执行完成,让出控制权给事件循环。
示例:
代码块
1 import asyncio
2
3 async def fetch_data(): 4 await asyncio.sleep(1) 5 return "data" 6 7 async def main(): 8 data = await fetch_data() 9 print(data) 10 11 asyncio.run(main())
- 如何读写文件?with open(...)相比传统open()有何优点?
答:
读文件示例:
代码块
1 with open("input.txt", "r", encoding="utf-8") as f:
写文件示例:¶
优点:with 是上下文管理器,会在代码块执行完后自动调用 close() 方法,避免忘记关闭文件造成资源泄露或锁未释放问题。
- 如何使用 requests 库进行网络请求?常见的请求方法有哪些? 答: 常见方法:requests.get(), requests.post(), requests.put(), requests.delete(), requests.head() 等; 示例:
代码块
1 import requests
2
3 response = requests.get("https://api.github.com")
支持传入参数、headers、Cookies、证书验证等多种场景,使用简单。
23. Python 常见的 Web 开发框架有哪些?各自特点如何?¶
答:
Django:功能大而全,内置 ORM、Admin 后台、模板系统等,适合快速构建复杂大型网站。
Flask:轻量级,仅提供核心功能,扩展灵活,自由度高,学习曲线相对平滑。 FastAPI:基于 ASGI,支持异步开发,性能好,自动生成接口文档,类型注解更友好。 Tornado / Sanic:也能异步处理,适合高并发、实时应用。
24. 在 Python 中如何对文件进行 CSV 和 JSON 的读写操作?¶
答:
CSV:
代码块 1 import csv
JSON:
代码块
1 import json 2 3 data = {"name": "Alice", "age": 25} 4 with open("data.json", "w", encoding="utf-8") as f: 5 json.dump(data, f, ensure_ascii=False) 6 7 with open("data.json", "r", encoding="utf-8") as f: 8 obj = json.load(f) 9 print(obj)
25. 如何进行单元测试?常见的测试框架有哪些?¶
答:
单元测试:编写小而精的测试用例,验证函数或模块的正确性;
常见框架:
使用示例(unittest):
代码块
1 import unittest 2 3 from mymodule import add 4 5 class TestAdd(unittest.TestCase): 6 def test_add(self): 7 self.assertEqual(add(2, 3), 5)
8 9 if name == "main": 10 unittest.main()
26. 如何使用 logging 模块来记录日志?和 print 相比有什么优势?¶
答:¶
示例:
代码块
1 import logging
2 logging.basicConfig(level=logging.INFO, filename="app.log") 4 logging.info("This is an info message.") 5 logging.warning("This is a warning.") 6 logging.error("This is an error.")
优势:
27. Python 里如何提升性能?一般有哪些调优手段?¶
答:¶
算法和数据结构优化:先从逻辑本身下手,减少不必要的循环或冗余计算;使用内置函数或库:如 sum(), map(), itertools 等,底层 C 实现通常更高效;生成器:替换列表推导式或大列表,减少内存消耗;多进程或分布式:绕过 GIL,利用多核 CPU;Cython / Numba:在关键性能敏感模块用 C/LLVM 优化;Profile:使用 cProfile 等工具定位瓶颈,针对性优化。
28. 如何在 Python 中创建虚拟环境?为什么需要虚拟环境?¶
答:¶
创建与使用(venv):
代码块 1 python -m venv venv 2 source venv/bin/activate # Linux/macOS 3 # 或 .\env\Scripts\activate # Windows 4 5 pip install requests
6 deactivate # 退出环境
原因:使各项目间依赖库和版本相互隔离,避免冲突;部署时可保证环境一致性。
29. 如何打包并发布一个 Python 项目? setup.py 和 pyproject.toml 各自起什么作用?¶
答:¶
打包思路:
setup.py:传统的打包配置文件,包含打包指令;
pyproject.toml:PEP 518 标准的项目配置,可定义构建系统(如 poetry、flit),在 Python 3.8+ 环境中常用。
30. 解释一下什么是上下文管理器(Context Manager)?为什么要使用 with 关键字?¶
答:¶
上下文管理器:实现了 enter 和 exit 方法的对象,可在代码块执行前后进行资源的初始化和清理。
with:调用 enter 进入上下文块,执行完代码后自动调用 exit 释放或清理资源。
示例:
代码块
1 class MyResource: 2 def enter(self): 3 print("Resource acquired") 4 return self 5 def exit(self, exc_type, exc_val, exc_tb): 6 print("Resource released")
31. 如何查看 Python 对象占用内存大小?¶
答:¶
可以使用 sys.getsizeof(obj) 获取对象本身的大小;
但若对象包含对其他对象的引用,sys.getsizeof() 不包含子对象的占用;
若想统计更全面的内存使用,可用第三方库 pympler、objgraph 等做更深层的分析。
32. 什么是闭包(closure)?在 Python 中如何创建一个闭包?¶
答:¶
闭包:当一个函数内部定义并返回了另一个函数,而内部函数引用了外部函数的变量,即使外部函数返回后,这些局部变量仍然被保留在内存中,就形成了闭包。
示例:
代码块 1 $ \underline{\text{def outer(x)} $: 2 $ \underline{\text{def inner(y)} $: 3 $ \underline{\text{return x + y}} $
闭包可以用来记住外部作用域的状态,实现工厂函数或装饰器等功能。
33. Python 中 new 和 init 的区别是什么?¶
答:¶
new:是一个静态方法,在创建实例时被调用,必须返回一个实例对象;它决定要创建什么样的实例。
init:是实例方法,用于初始化已创建的实例,设置实例属性等。
一般情况下只重写init,在特殊场景(如单例模式、继承不可变类型)才需要重写new。
- Python 中如何对函数进行性能分析(Profiling)?
答:
使用内置模块 cProfile:
代码块 1 python -m cProfile myscript.py
或在代码中
代码块
1 import cProfile 2 cProfile.run('main()'
使用 line_profiler 等第三方工具,能显示每行耗时;
在小段代码上可使用 time 或 timeit 模块来测量耗时。
35. 元类(metaclass)在 Python 中是什么概念?在什么情况下会用到?¶
元类:创建类的类。Python 在创建一个类对象时,会先调用元类的 new 或 init 来生成这个类;
用法:
代码块
1 class MyMeta(type): 2 def new(cls, name, bases, attrs): 3 # 可以在此动态修改类的属性或方法 4 return super().new(cls, name, bases, attrs) 5 6 class MyClass(metaclass=MyMeta): 7 pass
场景:框架底层或ORM,需在类创建时自动注册或注入逻辑,普通项目中不常用。
36. 如何判断一个对象是不是可迭代对象(Iterable)?¶
答: 使用 isinstance(obj, collections.abc.Iterable)(Python 3 中是在 collections.abc 下);或者看对象是否实现了 iter 方法; 也可尝试用 iter(obj) 看是否可成功。
37. yield from 的作用是什么?它与简单的 yield 有何区别?¶
答:
yield from:在一个生成器函数中直接对另一个可迭代对象/子生成器进行“委派”,可以简化多层嵌套生成器写法;
区别:
示例:
代码块 1 def gen_sub():
38. Python 中的多线程如何避免竞争条件(race condition)?¶
答:¶
使用同步原语,如 threading.Lock, RLock 等,对共享资源的访问前加锁,操作完成后解锁;或使用 Queue 等线程安全数据结构在多线程之间传递数据,尽量减少共享状态;如果是 CPU 密集型任务,不建议使用多线程,可考虑多进程或其他并行方案。
39. Python 中常用的数据可视化库有哪些?主要使用场景是什么?¶
答:¶
Matplotlib:最基础的2D绘图库,功能全面但写法较底层; Seaborn:基于Matplotlib,上层封装更美观,常用于统计图表; Plotly / Bokeh:可交互式绘图,适合在浏览器中展示动态效果; pyecharts:Python 调用 ECharts,生成炫酷交互图表。 多用于数据分析与可视化展示,如报表、探索性分析等。
40. Python 里的正则表达式(re 模块)有哪些常见用法?¶
答:¶
re.match(pattern, string):从字符串开头匹配; re.search(pattern, string):扫描整个字符串,返回第一个成功匹配对象; re.findall(pattern, string):返回所有非重叠匹配; re.sub(pattern, repl, string):替换; re.split(pattern, string):拆分字符串。 还可以用括号捕获分组、使用 re.compile() 提升重复匹配效率等。
41. Python 的日期和时间处理可以用哪些工具?简要说明。¶
答:
datetime 模块:核心类有 date, time, datetime, timedelta,可获取当前时间、计算时间差、格式化(strftime 和 strptime);
时区:可用第三方库 pytz 或 dateutil 处理时区转换和更复杂的日期解析;
例:
42. 如何管理 Python 项目的依赖库版本?¶
答:¶
requirements.txt:手动或用 pip freeze > requirements.txt 记录当前项目依赖及版本,部署时 pip install -r requirements.txt; Pipenv / Poetry:更现代化的依赖管理工具,自动创建虚拟环境、生成锁文件,安装更可控; conda:如果使用 Anaconda 发行版,可通过 conda 管理包和环境,常用于数据科学领域。
43. 如何快速用 Python 搭建一个简单的 HTTP 服务来测试静态文件?¶
答:
Python 3 中,进入某个目录后,可用命令:
代码块
1 python -m http.server 8000
就会在本地启动一个 8000 端口的 HTTP 服务器;
适合临时做静态文件服务,或快速测试网络访问效果。
44. 在 Python 中什么是猴子补丁(Monkey Patching)?有什么风险?¶
答:¶
定义:在运行时动态修改或替换模块、类或函数的部分逻辑;
示例:
代码块
1 import some_module 2 def new_func(args, *kwargs): # new behavior pass 6 7 some_module.old_func = new_func
风险:如果在核心生产代码中滥用,会导致调试和维护困难,影响系统可预测性。一般只在测试或特定场景下使用。
45. Python 中的序列化和反序列化怎么做?常见模块有哪些?¶
答:¶
序列化:将 Python 对象转换为字节流或字符串;反序列化则是将其恢复成对象;
常见模块:
46. Python 中函数的默认参数为什么不要使用可变对象?¶
答:¶
默认参数在函数定义阶段只执行一次初始化,若该默认值是可变对象(如列表、字典),后续多次调用会共享这一个对象;
可能导致意想不到的修改和 Bug;
通常用 None 作默认参数,在函数内部再初始化需要的可变对象。
47. 如果要写一个高并发高流量的 Python Web 服务,需要考虑哪些方面?¶
答:¶
异步框架:选择 FastAPI、Tornado、Sanic 等支持异步的框架;
负载均衡:将多个 Python 进程或多台服务器组成集群,用 Nginx 或负载均衡器分发请求;
缓存:在应用层或数据库层使用缓存(Redis、Memcached)减轻数据库压力;
水平扩展:通过容器(Docker)、Kubernetes进行容器化和弹性扩容;
避免 GIL 性能瓶颈:CPU 密集型场景可使用多进程或 C 扩展。
48. 如何进行 HTTPS 请求?Python 默认支持吗?需要额外配置吗?¶
答:¶
默认支持:requests 对 HTTPS 会自动进行 SSL 证书验证;
自签名证书:若证书不可信,则需 verify=False(不推荐)或提供自定义 CA 证书路径;
客户端证书:可在 requests 中通过 cert=('client.crt', 'client.key') 指定。
49. 如何让多个线程安全地共享一个全局计数器?¶
答:¶
使用 threading.Lock 来实现互斥访问:
代码块
1 import threading
2 lock = threading.Lock()
4 counter = 0
5 def increment(): 7 global counter 8 with lock:
或者使用线程安全的数据结构(如 queue.Queue),避免直接共享可变变量。
- Python 中常用的进程间通信方式有哪些?
答:¶
multiprocessing 模块提供:
也可用第三方消息中间件(Redis、RabbitMQ、Kafka等)做分布式进程通信。
- Python 能否实现热更新(不重启服务,动态加载新代码)?会有哪些限制?
答:¶
原理:通过 importlib.reload() 或框架内置的 autoreload 机制在代码文件变更后重载模块;
限制:
52. 什么是 metaclass=ABCMeta,如何使用抽象类(Abstract Class)?¶
答:
ABCMeta 是 Python 提供的抽象基类元类(位于 abc 模块中),用来定义抽象类;
使用:
代码块
1 from abc import ABC, abstractmethod 2 3 class Animal(ABC): 4 @abstractmethod 5 def speak(self): 6 pass 7 8 class Dog(Animal): 9 def speak(self): 10 print("Woof!")
没有实现抽象方法的类不可实例化。
53. 如何在 Python 中实现单例模式?¶
答:¶
常见方式:重写 new,确保只创建一个实例:
也可以使用装饰器或元类等方式实现,但要注意线程安全。
54. 简要说一下 Django 的 MVT 模式和主要组件。¶
答:¶
MVT:Model - View - Template,类似 MVC,但 Django 的 View 更倾向于处理业务逻辑,Template 仅负责呈现页面;
主要组件:
55. 简要说明 init.py 文件的作用。¶
答:¶
在 Python 2 中,init.py 用来表明该目录是一个包,否则不会被识别为包;
在 Python 3.3+ 中,即使没有 init.py 也能被当作命名空间包,但通常仍建议保留;
可以在 init.py 中执行一些包初始化逻辑、对外暴露 API 等。
56. Python 中如何获取当前脚本所在的目录路径?¶
答:¶
使用 file 和 os.path:
代码块
1 import os 2 current_dir = os.path.dirname(os.path.abspath点评)
file 表示当前脚本文件名,os.path.abspath() 获取绝对路径,os.path.dirname() 获取目录部分。
57. 什么是 lambda 匿名函数?与普通函数相比有什么局限?¶
答:¶
lambda:用来创建简短匿名函数,语法形如 lambda 参数:表达式;
局限:只能包含一个表达式,无法包含复杂语句或多行逻辑,功能相对有限;
常用作回调函数,或搭配 map,filter 等操作简单逻辑时使用。
58. Python 中使用多重继承需要注意什么?如何避免菱形继承问题?¶
答:¶
多重继承:可能导致方法解析顺序(MRO)复杂,增加维护难度;
菱形继承问题:多个父类有共同祖先类时,会形成菱形继承关系;Python 采用 C3 线性化算法来计算 MRO;
避免:遵循“组合优于继承”的原则,不滥用多重继承,或在调用父类方法时统一使用 super() 并让 MRO 帮助调度。
59. 谈谈你在使用 Python 时常见的几个坑或者最佳实践。¶
答:¶
可变默认参数:要用 None 代替可变对象,并在函数内部初始化,避免多次调用共享状态;
编码和 Unicode:写文件或处理字符串时要注意编码(特别是 Python 2 与 Python 3 的差异);
数据库连接:记得关闭或用连接池,避免连接泄漏;
GIL 限制:CPU 密集型任务避免用多线程,或使用 C 扩展/多进程;
测试和文档:通过单元测试、类型注解(mypy)等提高代码可维护性;
Profile 和优化:先用 cProfile 找瓶颈,再针对性优化,切勿盲目做微小层面的优化。
60. 最后总结一下 Python 的主要优点和缺点,你是如何在实际项目中取舍和使用的?¶
答:
优点:
缺点:
取舍:根据项目特点选择 Python 如果是 Web、脚本、爬虫、数据分析场景,Python 非常合适;如果是高并发或高性能实时系统,可能需要多进程、分布式或其他语言来互补。
以上 60 道问题涵盖了 Python 的核心概念、实用技巧和在工作中经常被面试官考察的领域。建议在面试前结合自己实际的项目经验,针对这些题目所涉及的知识点进行反复练习和理解,这样在真正的面试场景里能够给出既有理论深度又有项目实践的回答。祝面试顺利,前程似锦!