当前位置: 首页 > news >正文

Python面试题 01

目录

1. dict 和 set 的区别?

2. Python 的实现和其他语言不一致?

3. 你能想到其他语言为什么还要保留红黑树的实现呢?不都直接用 hashTable?

✅ 1. 有序性 (Ordering)

✅ 2. 稳定的性能与可预测性 (Stable Performance & Predictability)

✅ 3. 对键(Key)的要求更宽松

✅ 4. 语言设计哲学的差异

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

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

🔹 基础科学计算:

🔹 可视化:

🔹 机器学习:

🔹 大数据:

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

🔄 迭代器(Iterator)

⚡ 生成器(Generator)

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

🌀 协程(Coroutine)

🧵 线程(Thread)

9. Numpy 和 Pandas 区别在哪?

📊 NumPy

📈 Pandas

✅ 总结建议

1. dict 和 set 的区别?

  • dict(字典):键值对集合,{key: value}。键必须唯一且可哈希,值任意。

    • 用途:存储映射关系,如用户ID → 用户信息。
    • 示例:{"name": "Alice", "age": 25}
  • set(集合):无序不重复元素集合,{element1, element2, ...}

    • 用途:去重、成员检查、数学集合运算(并集、交集等)。
    • 示例:{1, 2, 3}

核心区别

  • dict 存储的是“键→值”的映射;set 只存储“键”(即元素本身),没有值。
  • 底层实现类似(都是哈希表),但语义和API不同。

2. Python 的实现和其他语言不一致?

是的,Python 的内置数据结构(如dict,set)在 CPython 中是用开放寻址法 + 二次探测实现的哈希表,而其他语言可能不同:

  • Java / C++ STL:常用链地址法(链表+数组)处理冲突。
  • Go:使用动态扩容 + 分段哈希表
  • Ruby:早期用链地址法,后来也优化为开放寻址。

📌为什么不一样?

  • 设计哲学不同:Python 追求简洁高效,CPython 用开放寻址减少内存碎片。
  • 历史原因:Python 早期设计选择影响了后续演进。
  • 性能权衡:开放寻址缓存友好,但删除复杂;链地址法删除简单,但指针开销大。

3. 你能想到其他语言为什么还要保留红黑树的实现呢?不都直接用 hashTable?

虽然哈希表平均 O(1),但红黑树(平衡二叉搜索树)有不可替代的优势:

✅ 1. 有序性 (Ordering)

红黑树是天然有序的:红黑树是一种自平衡的二又搜索树。它的结构保证了无论你如何插入或删除元素,对它进行中序遍历,得到的结果永远是按键值排序的。

哈希表是无序的:当你遍历一个哈希表时,元素的顺序是混乱的,它取决于哈希函数的实现、哈希冲突以及插入/删除的历史。在Python3.7+中,dict虽然保持了插入顺序,但这和按键值排序是完全不同的概念。

  • 红黑树天然保持键的排序,支持范围查询(如get_range(key_min, key_max))、前驱/后继查找。
  • 哈希表无序,无法高效做范围操作。
✅ 2. 稳定的性能与可预测性 (Stable Performance & Predictability)
  • 哈希表最坏情况 O(n)(大量冲突时),红黑树始终 O(log n)。
  • 实时系统、金融交易等场景需要确定性延迟。
✅ 3. 对键(Key)的要求更宽松
  • 哈希表要求键可哈希(hashable),红黑树只需可比较(comparable)。
  • 比如自定义对象若无合理 hash 函数,但能定义<运算符,仍可用红黑树。
✅ 4. 语言设计哲学的差异
  • Java 的TreeMap/ C++ 的std::map提供有序容器,满足特定需求。
  • Python 的dict从 3.7+ 保证插入顺序,但不是“排序”,而是“遍历顺序=插入顺序”。

📌 举例:数据库索引常用 B+ 树(红黑树变种),因为要支持范围扫描和排序。


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

特性进程(Process)线程(Thread)
资源隔离独立内存空间,互不影响共享同一进程的内存和资源
创建开销较大较小
通信方式IPC(管道、队列、共享内存等)直接访问共享变量(需锁保护)
GIL 影响不受 GIL 限制,可真正并行受 GIL 限制,同一时刻只有一个线程执行字节码
适用场景CPU 密集型任务I/O 密集型任务

💡GIL(全局解释器锁):CPython 中防止多线程同时执行字节码,导致多线程在 CPU 密集任务上无法并行。

✅ 推荐:

  • CPU 密集 →multiprocessing
  • I/O 密集 →threadingasyncio

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

常用数据处理库:

🔹 基础科学计算:
  • NumPy:多维数组、矩阵运算、广播机制。
  • Pandas:DataFrame/Series,表格数据处理、清洗、聚合。
  • SciPy:科学计算(积分、优化、统计等)。
🔹 可视化:
  • Matplotlib:基础绘图。
  • Seaborn:基于 Matplotlib 的统计图表。
  • Plotly:交互式图表。
🔹 机器学习:
  • Scikit-learn:传统 ML 算法。
  • TensorFlow / PyTorch:深度学习框架。
🔹 大数据:
  • Dask:并行计算,兼容 Pandas/NumPy API。
  • PySpark:Spark 的 Python 接口。

✅ 我常用:

  • 数据分析 → Pandas + NumPy
  • 可视化 → Seaborn + Plotly
  • 建模 → Scikit-learn

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

🔄 迭代器(Iterator)
  • 实现__iter__()__next__()方法的对象。
  • 手动控制迭代过程。
  • 示例:
class MyIter: def __init__(self, max): self.max = max self.current = 0 def __iter__(self): return self def __next__(self): if self.current < self.max: val = self.current self.current += 1 return val else: raise StopIteration
⚡ 生成器(Generator)
  • 使用yield关键字的函数,自动实现迭代器协议。
  • 更简洁,惰性求值,节省内存。
  • 示例:
def my_gen(max): for i in range(max): yield i

区别总结

特性迭代器生成器
实现方式类 +__next__函数 +yield
代码复杂度
状态管理手动维护自动暂停/恢复
内存效率同生成器(惰性)同迭代器(惰性)

💡 所有生成器都是迭代器,但反之不成立。


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

🌀 协程(Coroutine)
  • 用户态轻量级线程,由程序员手动调度(或通过 async/await 自动调度)。
  • 单线程内并发,通过yieldawait挂起/恢复。
  • 适用于 I/O 密集型任务(网络请求、文件读写等)。
🧵 线程(Thread)
  • 操作系统级别的并发单元,由 OS 调度。
  • 多线程可并行(多核),但受 GIL 限制(CPython)。
  • 上下文切换成本高,需锁保护共享资源。

本质区别

维度协程线程
调度者用户程序(或事件循环)操作系统
并发模型协作式(主动让出)抢占式(OS 强制切换)
开销极低(无内核态切换)较高(内核态切换)
共享数据无需锁(单线程内)需锁避免竞态条件
适用场景高并发 I/O(如 Web 服务器)CPU 密集 or 真正并行需求

📌 Python 中协程通过asyncio实现:

import asyncio async def fetch_data(): await asyncio.sleep(1) return "data" asyncio.run(fetch_data())

9. Numpy 和 Pandas 区别在哪?

📊 NumPy
  • 核心:ndarray(N 维数组)
  • 优势:数值计算快、内存紧凑、支持广播、向量化操作。
  • 适用:纯数值运算、矩阵运算、图像处理、科学计算。
📈 Pandas
  • 核心:Series(一维)、DataFrame(二维表格)
  • 优势:标签索引、缺失值处理、分组聚合、时间序列、数据清洗。
  • 适用:数据分析、报表生成、ETL、业务逻辑处理。

优先选择 NumPy 的场景

  • 纯数学运算(如矩阵乘法、傅里叶变换)
  • 图像/信号处理(像素数组操作)
  • 需要极致性能且数据结构规整

优先选择 Pandas 的场景

  • 处理带列名的表格数据(CSV/Excel/SQL)
  • 数据清洗(去重、填充、转换)
  • 分组聚合(groupby)、透视表(pivot_table)
  • 时间序列分析(resample, rolling)

📌 实际工作中常配合使用:

import numpy as np import pandas as pd df = pd.DataFrame({'A': [1,2,3], 'B': [4,5,6]}) arr = df.values # 转为 NumPy 数组进行计算 result = np.sum(arr, axis=0)

✅ 总结建议

这些题目覆盖了 Python 核心数据结构、并发模型、生态工具,是python开发岗位常见考点。建议:

  • 理解原理(如哈希表 vs 红黑树)
  • 掌握实战场景(何时用进程/线程/协程)
  • 熟悉主流库的定位和选型(NumPy vs Pandas)
http://www.jsqmd.com/news/476688/

相关文章:

  • DeOldify色彩科学解析:模型如何学习并还原“记忆色”
  • Hbuilder X最新版真机调试全攻略:从安卓到iOS的避坑指南
  • SDXL 1.0电影级绘图工坊效果展示:实测生成高清摄影级风景图
  • 工业质检场景下Halcon纹理检测的5个常见误区与解决方案
  • OpenClaw 国内版快速安装指南 (2026 更新)
  • C语言插入排序实战:PTA编程题解析与3种实现方法对比
  • Cloudflare Email Routing + Workers 实战:5分钟搭建免费邮件发送服务(附域名配置避坑指南)
  • CasRel关系抽取教程:使用LangChain封装CasRel为结构化数据工具
  • 大模型应用:基于《症状自评量表SCL-90》与大模型的心理评估系统全解析.113
  • 数学史:欧氏几何之后停滞1800年,虚数i激发和重构了数学
  • 小白也能玩转LFM2.5-1.2B:Ollama快速部署与参数调优全攻略
  • Proxifier避坑全记录:从代理规则配置到通配符失效排查(Win/Mac双平台)
  • 乙巳马年·皇城大门春联生成终端W快速体验:使用ChatGPT生成提示词技巧
  • KimiChat教学神器:3分钟搞定一份高质量试卷(附完整操作指南)
  • 进阶版猜数字小游戏(C语言)超详细教程
  • 霜儿-汉服-造相Z-Turbo镜像合规性:符合《生成式AI服务管理暂行办法》要求
  • WeKnora应用案例:研发团队如何用AI即时回溯技术决策?
  • CHORD-X系统IDE(IntelliJ IDEA)远程开发环境配置指南
  • mysql学习day1
  • 跨平台集成:将OFA-VE嵌入Java企业应用
  • Android开发必备:如何优雅调用高德、百度地图App(附完整代码与避坑指南)
  • switch-case多分支选择结构
  • 实战演练:从华为ICT大赛真题看企业网络部署中的IPv6与安全认证陷阱
  • ESP8685硬件安全加速器与外设协同设计深度解析
  • 匿名无人机S.Bus模式设置全攻略:从遥控器到飞控的完整配置流程
  • Unity遮罩优化:用Shader替代Mask组件消除锯齿(附完整代码)
  • 物流优化必看:遗传算法在配送路径规划中的调参指南(以TSP为例)
  • 计算机网络:自顶向下方法(第七版)第三章 学习分享(三)
  • Windows 11下mmdet3d v0.17.1环境配置与常见错误解决指南
  • Nomic-Embed-Text-V2-MoE与网络原理:深入理解互联网传输协议对模型API延迟的影响