Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Python FAQ

内容:

  • 基础语法
  • 数据结构
  • 进阶特性
  • 面向对象
  • 函数式编程
  • 并发(多线程、异步、进程)
  • 网络与文件
  • 标准库
  • 高级机制
  • 项目实战
  • 性能优化
  • 常见陷阱

完全适用于 Python 开发 / 爬虫 / 数据工程 / 后端。

一、Python 基础

1. Python 的主要特点是什么?

  • 解释型、动态类型
  • 强类型
  • 跨平台
  • 拥有丰富标准库
  • 面向对象、函数式风格都支持
  • 可读性好、开发效率高

2. 列表和元组有什么区别?

列表 list 元组 tuple
可变 不可变
适合动态数据 适合固定结构数据
占用更大内存 内存更小,速度更快
append / pop 无修改方法

实战经验:

数据不会变化时应优先选择 tuple,可以用于 dict key。

3. Python 是如何进行内存管理的?

  • 引用计数(primary GC)
  • 标记-清除(处理循环引用)
  • 分代回收机制

4. == 和 is 的区别?

  • == 比较值
  • is 比较对象引用(是否是同一个对象)

5. 浅拷贝 deep / 深拷贝 shallow 的区别?

copy.copy()      # 浅拷贝,只复制最外层
copy.deepcopy()  # 深拷贝,递归复制所有层级

6. Python 中可变对象和不可变对象?

  • 不可变:int, float, str, tuple, frozenset
  • 可变:list, dict, set

7. 什么是可迭代对象 Iterable?

具有 __iter____getitem__ 方法的对象。

如:list, tuple, dict, set, file, range, generator

8. 什么是生成器 Generator?

使用 yield 返回的函数,惰性计算、节约内存。

9. Python 中的作用域规则?(LEGB)

  • L: Local
  • E: Enclosing
  • G: Global
  • B: Built-in

10. 什么是装饰器?

本质是一个接受函数并返回新函数的高阶函数,用于:

  • 日志
  • 权限控制
  • 缓存
  • 性能统计

示例:

def deco(fn):
    def wrapper(*a, **kw):
        print("before")
        return fn(*a, **kw)
    return wrapper

二、数据结构

11. list、tuple、set、dict 的时间复杂度?

操作 list tuple set dict
访问 O(1) O(1) N/A O(1)
插入 O(n) 不支持 O(1) O(1)
删除 O(n) 不支持 O(1) O(1)
查找 O(n) O(n) O(1) O(1)

12. Python 字典为什么是 O(1) 查找?

因为使用哈希表存储,通过 key 的 hash 定位 bucket。

13. set 的底层原理是什么?

和 dict 类似,也是哈希表,不存 value。

14. Python 中如何对字典排序?

sorted(d.items(), key=lambda x: x[1])

15. 列表推导式 vs map/filter

列表推导式可读性更好:

[x*x for x in lst if x>0]

16. zip 如何工作?

打包多个可迭代对象,返回 tuple:

zip([1,2], ["a","b"]) -> [(1,"a"), (2,"b")]

17. enumerate 的用法?

获取(索引, 值):

for i, v in enumerate(items, start=1):

18. 如何反转一个列表?

lst[::-1]
list(reversed(lst))

19. 什么是字典推导式?

{x: x*x for x in range(5)}

20. 为什么 list 不是线程安全的?

因为内部没有 lock,多线程 append 时会竞争资源。

三、函数与类

21. 什么是闭包?

函数内部引用外部变量,并在函数返回后仍然有效。

22. 什么是 lambda?为什么不推荐大量使用?

匿名函数,可读性差,功能有限。

23. *args 和 **kwargs 的作用?

接收任意数量的位置参数和关键字参数。

24. 如何判断一个对象是否可调用?

callable(obj)

25. @staticmethod vs @classmethod vs @property

类型 第一个参数 用途
staticmethod 工具函数
classmethod cls 类级行为(工厂方法)
property self 伪属性

26. super() 如何工作?

执行 MRO(方法解析顺序)链上的下一个类方法。

27. Python 多继承如何解决冲突?

使用 C3 MRO。

28. dataclass 有什么优点?

  • 自动生成 init、repr
  • 支持类型注解
  • 可选 frozen=True(不可变)

29. slots 有什么作用?

限制实例属性,减少内存占用、提高访问速度。

30. enter 和 exit 实现什么?

上下文管理器(with)。

四、并发(异步/线程/进程)

31. GIL 是什么?

全局解释器锁,使同一时刻只能有一个线程执行 Python 字节码。

32. ThreadPoolExecutor 和 ProcessPoolExecutor 区别?

ThreadPool ProcessPool
受 GIL 限制 不受 GIL
适合 IO 适合 CPU
轻量

33. asyncio 的本质?

事件循环 + 协程 + 可等待对象。

34. async/await 的作用?

声明协程,用于异步 IO。

35. 协程、线程、进程的区别?

  • 协程最轻
  • 线程中等
  • 进程最重(拥有独立内存)

36. asyncio.run 做了什么?

  • 创建事件循环
  • 执行协程
  • 关闭循环

37. 多线程如何共享数据?

使用 Lock:

lock = threading.Lock()
with lock:
    ...

38. 如何在 asyncio 中执行 CPU 密集任务?

loop.run_in_executor(ProcessPoolExecutor(), func)

39. queue.Queue vs asyncio.Queue 区别?

  • queue.Queue:线程安全
  • asyncio.Queue:异步任务间通信

40. multiprocessing 为什么不能在 Windows 中使用 lambda?

因为 Windows 采用 spawn,必须可序列化。

五、文件/网络

41. with 打开文件的好处?

自动关闭文件,防止资源泄漏。

42. 如何读取大文件?

使用流式读取:

for line in f:

43. JSON 加载时如何避免浮点误差?

用 parse_float=Decimal 或 orjson。

44. requests 为什么不是异步的?

因为它基于阻塞 IO。

45. urllib vs requests?

requests 更易用、功能更强。

46. 如何下载大文件?

stream=True

47. 如何判断路径是否存在?

Path.exists()

48. 如何构建安全 SQL?

使用参数绑定,禁止拼接。

49. 如何解析 URL 参数?

from urllib.parse import urlparse, parse_qs

50. 如何写一个线程安全的文件写入?

使用锁。

六、高级特性

51. 元类是什么?

创建类的类(控制类的行为)

52. 什么是猴子补丁?

运行时修改类或模块。

53. getattr 和 getattribute 区别?

  • getattr:属性不存在时调用
  • getattribute:所有属性访问都会调用

54. 什么是描述符?

实现 __get__, __set__, __delete__ 的类,用于控制属性行为。

55. 迭代器协议是什么?

对象实现:

  • __iter__
  • __next__

56. yield from 的作用?

将子生成器的值自动传递给外层生成器:

yield from sub_generator()

57. functools.lru_cache 的优点?

缓存函数返回值,提高性能。

58. 为什么 Python 不能进行 tail call optimization?

避免隐藏 stack trace,保持 debug 能力。

59. 装饰器为什么需要 wraps?

保留原函数的元数据(名字、文档)。

60. 什么是鸭子类型?

不是通过“类型”判断,而是通过“行为”判断。