Python 的标准库非常强大,除了我们之前聊过的 re 和 json,collections 和 math 也是开发中极高频使用的两个模块。
简单来说:
collections:提供了更高级、更智能的数据结构(容器),让你处理列表、字典时更优雅高效。math:提供了更丰富的数学函数和常量,满足科学计算和复杂运算的需求。
下面我为你详细拆解这两个模块的核心用法。
📦 collections 模块:高级容器
这个模块是对 Python 内置容器(如 list, dict, tuple)的扩展,提供了 5 个非常实用的数据类型。
1. Counter:计数器
这是数据分析师最爱用的工具之一。它可以快速统计可哈希对象(如字符串、数字)出现的次数。
- 特点:返回一个字典子类,键是元素,值是出现次数。
- 场景:词频统计、票数统计。
from collections import Counter# 统计列表中元素出现的次数words = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']count = Counter(words)print(count) # 输出: Counter({'apple': 3, 'banana': 2, 'orange': 1})# 获取出现次数最多的前2个元素print(count.most_common(2)) # 输出: [('apple', 3), ('banana', 2)]
2. defaultdict:默认字典
普通字典在访问不存在的键时会报错 KeyError,而 defaultdict 会自动为不存在的键创建一个默认值。
- 特点:初始化时需传入一个工厂函数(如 int, list)。
- 场景:分组数据、累加计算。
from collections import defaultdict# 默认值为 int(),即 0dd = defaultdict(int)dd['a'] = 1# 访问不存在的键 'b',不会报错,而是自动创建并赋值为 0print(dd['b']) # 输出: 0# 场景:按颜色分组水果fruits = [('apple', 'red'), ('banana', 'yellow'), ('grape', 'purple'), ('cherry', 'red')]groups = defaultdict(list)for fruit, color in fruits: groups[color].append(fruit)print(groups)
3. namedtuple:具名元组
它让你可以像访问对象属性一样访问元组元素,解决了普通元组通过索引访问可读性差的问题(比如 p[0] 不如 p.x 直观)。
- 特点:内存占用与普通元组相同,但代码可读性极高。
- 场景:定义简单的数据结构(如坐标点、数据库记录)。
from collections import namedtuple# 定义一个 Point 类型Point = namedtuple('Point', ['x', 'y'])p = Point(10, 20)# 像访问属性一样访问print(p.x) # 输出: 10print(p.y) # 输出: 20# 依然支持元组的特性print(p[0]) # 输出: 10
4. deque:双端队列
这是一个线程安全的双端队列,支持在队列两端高效地添加或删除元素(时间复杂度 O(1))。相比之下,列表在头部插入元素的效率很低(O(n))。
- 特点:支持 append, appendleft, pop, popleft。
- 场景:实现栈、队列、滑动窗口。
from collections import dequedq = deque([1, 2, 3])dq.append(4) # 右端添加dq.appendleft(0) # 左端添加print(dq) # 输出: deque([0, 1, 2, 3, 4])dq.popleft() # 左端弹出print(dq) # 输出: deque([1, 2, 3, 4])
🧮 math 模块:数学运算
math 模块提供了基于 C 标准库的数学函数,适用于浮点数计算和科学计算。
1. 常用常量
math.pi:圆周率 π (≈ 3.14159)math.e:自然对数的底数 e (≈ 2.71828)
2. 核心函数速览
| | |
|---|
math.ceil(x) | | math.ceil(4.2) |
math.floor(x) | | math.floor(4.8) |
math.sqrt(x) | | math.sqrt(16) |
math.pow(x, y) | | math.pow(2, 3) |
math.factorial(x) | | math.factorial(5) |
math.gcd(a, b) | | math.gcd(48, 18) |
math.fsum(iterable) | | |
3. 实战代码示例
import math# 1. 计算圆的面积r = 5area = math.pi * r ** 2print(f"圆面积: {area}") # 输出: 78.5398...# 2. 向上取整(常用于分页计算)total_items = 103items_per_page = 10pages = math.ceil(total_items / items_per_page)print(f"总页数: {pages}") # 输出: 11# 3. 计算直角三角形斜边# 等价于 math.sqrt(a**2 + b**2)c = math.hypot(3, 4)print(f"斜边长度: {c}") # 输出: 5.0# 4. 对数运算# 计算以 2 为底 8 的对数log_val = math.log(8, 2)print(f"log2(8): {log_val}") # 输出: 3.0
📌 总结
- 如果你需要统计频率、处理队列或定义简单数据结构,请首选
collections。 - 如果你需要进行几何计算、取整或复杂的数学变换,请使用
math。
这两个模块都是 Python 标准库的一部分,无需安装即可直接 import 使用,是提升代码质量和效率的必备工具。