目录

1. 简述下 Python 中的字符串、列表、元组和字典

2. 深拷贝和浅拷贝概念理解

3. 为什么其他语言还要保留红黑树?不都直接用 hashTable?

4. 在 Python 中,进程和线程的区别?

5. Python 数据处理的库有哪些?用过吗?

7. Python 的迭代器 (Iterator) 和生成器 (Generator) 有什么区别?

8. 什么是协程?它和线程有什么本质区别?

9. NumPy 和 Pandas 区别在哪?


1. 简述下 Python 中的字符串、列表、元组和字典

关键词:可变性、有序性、哈希性、用途对比

标准回答

这是 Python 最基础的四种数据结构,它们的核心区别在于是否可变使用场景

  • 字符串 (str)

    • 不可变序列,存储文本数据。
    • 支持切片、拼接、格式化等操作。
    • 示例s = "hello" -> s[0] = 'H' ❌ 报错(不可变)
  • 列表 (list)

    • 可变序列,存储有序元素集合。
    • 支持增删改查,底层为动态数组。
    • 示例lst = [1, 2, 3] -> lst.append(4) ✅ 成功
  • 元组 (tuple)

    • 不可变序列,常用于固定数据集合。
    • 比列表更轻量,可作为字典键(因可哈希)。
    • 示例t = (1, 2, 3) -> t[0] = 0 ❌ 报错
  • 字典 (dict)

    • 可变映射类型,存储键值对(Key-Value)。
    • 基于哈希表实现,查找效率 O(1)。
    • 要求:键必须是不可变类型(如 str, int, tuple)。

💡 加分句

“在项目中我常根据可变性做选型:用元组做函数多返回值或配置常量,用字典做动态参数映射,列表处理动态数据流,字符串贯穿全流程。理解它们的可变性是避免 bug 的关键。”


2. 深拷贝和浅拷贝概念理解

关键词:引用复制 vs 对象复制、copy 模块、嵌套对象

标准回答

在 Python 中,赋值操作只是引用传递,不创建新对象。拷贝分为两种:

  • 浅拷贝 (Shallow Copy)

    • 创建新对象,但只复制顶层引用,嵌套对象仍共享。
    • 修改嵌套对象会影响原对象。
    • 实现copy.copy() 或 切片 [:](仅限列表)。
  • 深拷贝 (Deep Copy)

    • 递归复制所有层级对象,完全独立。
    • 修改拷贝对象不影响原对象。
    • 实现copy.deepcopy()

💡 加分句

“我曾在项目中因误用浅拷贝导致配置被污染。后来统一规范:简单结构用切片,复杂嵌套结构必须用 deepcopy,并在关键函数加注释提醒团队。”


3. 为什么其他语言还要保留红黑树?不都直接用 hashTable?

关键词:有序性、稳定性能、Key 要求、语言设计哲学

标准回答

虽然 hashTable 平均性能 O(1),但红黑树仍有不可替代优势:

  1. 有序性 (Ordering)

    • 红黑树是自平衡二叉搜索树,中序遍历可得有序序列。
    • hashTable 无序,需额外排序(O(n log n))。
  2. 稳定性能与可预测性

    • 红黑树最坏情况 O(log n),性能稳定。
    • hashTable 在哈希冲突严重时退化为 O(n)。
  3. 对 Key 的要求更宽松

    • 红黑树只需 Key 支持比较(<, >)。
    • hashTable 要求 Key 可哈希且哈希函数均匀。
  4. 语言设计哲学差异

    • C++ STL 的 map 用红黑树(追求确定性),unordered_map 用 hashTable。
    • Java 的 TreeMap vs HashMap 同理。

💡 加分句

“在金融交易系统中,我曾用红黑树做订单簿排序,因需实时获取价格有序队列。若用 hashTable,每次撮合前排序会引入不可控延迟。”


4. 在 Python 中,进程和线程的区别?

关键词:资源隔离、GIL 限制、CPU 密集 vs IO 密集

标准回答

特性 进程 (Process) 线程 (Thread)
资源隔离 独立内存空间,互不干扰 共享进程内存,需加锁
创建开销 大(需复制父进程资源) 小(共享资源)
通信方式 队列、管道、共享内存 全局变量、队列
GIL 影响 无(多进程可绕过 GIL) 受限(同一进程内串行)

适用场景

  • 进程:CPU 密集型(如图像处理、科学计算)。
  • 线程:IO 密集型(如网络爬虫、Web 请求)。

💡 加分句

“我曾优化一个视频转码服务:CPU 密集部分用多进程(绕过 GIL),IO 密集部分用多线程(如文件读写),最终吞吐量提升 3 倍。”


5. Python 数据处理的库有哪些?用过吗?

关键词:Pandas、NumPy、Dask、Polars、数据清洗

标准回答

Python 数据处理生态丰富,主流库包括:

  • Pandas

    • 数据分析“瑞士军刀”,支持 DataFrame、Series。
    • 适合中小数据量(< 10GB),提供清洗、聚合、可视化功能。
  • NumPy

    • 科学计算基础库,支持多维数组和矩阵运算。
    • 性能远超原生列表,是 Pandas 底层依赖。
  • Dask / Polars

    • Dask:并行计算库,可处理超大数据集(> 100GB)。
    • Polars:Rust 实现的高性能 DataFrame 库,速度比 Pandas 快 5-10 倍。

💡 加分句

“在处理 50GB 日志时,Pandas 内存溢出,我改用 Dask 分块处理,结合 Parquet 格式压缩,最终在 16G 内存机器上完成分析。”


7. Python 的迭代器 (Iterator) 和生成器 (Generator) 有什么区别?

关键词:惰性计算、状态保存、__iter__ vs yield

标准回答

  • 迭代器 (Iterator)

    • 实现 __iter__() 和 __next__() 方法的对象。
    • 需手动管理状态,适合自定义迭代逻辑。
  • 生成器 (Generator)

    • 用 yield 关键字定义的函数,自动实现迭代器协议。
    • 惰性计算:按需生成值,节省内存。
    • 状态保存:每次 yield 后暂停,下次从暂停处继续。

示例

# 生成器函数
def gen():
    for i in range(3):
        yield i  # 每次调用 next() 返回一个值

g = gen()
print(next(g))  # 0
print(next(g))  # 1

💡 加分句

“我曾用生成器处理千万级日志行:逐行读取 + yield 处理,内存占用始终稳定在 10MB 内,而列表会直接爆内存。”


8. 什么是协程?它和线程有什么本质区别?

关键词:用户态调度、非抢占式、async/await、高并发

标准回答

  • 协程 (Coroutine)

    • 用户态的轻量级线程,由程序员控制调度(await/yield)。
    • 非抢占式:一个协程运行到 await 才让出控制权。
    • 实现:Python 用 async/await 语法(基于 asyncio 库)。
  • 与线程的本质区别

    • 调度权:线程由操作系统内核调度(抢占式),协程由用户/事件循环调度(协作式)。
    • 开销:协程切换开销微秒级,线程毫秒级。
    • GIL:协程可绕过 GIL(如 asyncio + aiohttp),线程受 GIL 限制。

💡 加分句

“在写爬虫时,我用 asyncio + aiohttp 启动 1000 个协程,3 秒内完成请求,而多线程需 10 秒以上。协程的高并发 + 低开销是 IO 密集场景的最优解。”


9. NumPy 和 Pandas 区别在哪?

关键词:数组运算、数据框、性能、数据分析

标准回答

特性 NumPy Pandas
核心结构 ndarray(多维数组) DataFrame(二维表)、Series(一维)
功能侧重 数值计算、矩阵运算 数据清洗、聚合、时间序列
性能 极高(C 语言实现) 依赖 NumPy,但有额外开销
适用场景 科学计算、AI 底层 业务数据分析、报表生成

优先选择 NumPy 的场景

  • 纯数值计算(如矩阵乘法、傅里叶变换)。
  • 需要极致性能(如图像处理、机器学习特征工程)。

优先选择 Pandas 的场景

  • 有表头、缺失值、混合类型的数据。
  • 需要分组聚合、透视表、时间序列分析。

💡 加分句

“在机器学习项目中,我用 Pandas 做数据预处理(清洗、编码),用 NumPy 做模型训练(矩阵运算)。两者结合既能快速处理数据,又能保证计算效率。”

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐