Python 标准库是个大宝藏,但很多人只会用 os 和 sys。今天挑了几个冷门但超实用的内置模块,用过的都说真香。
1. 用 re.findall 提取所有匹配
老一辈程序员(包括刚学三天的你)可能会这样写:
text = 'Call 123-456-7890 or 098-765-4321'numbers = []i = 0while i < len(text): # 手动解析数字... pass
其实标准库一句话就能搞定,而且不会掉头发:
import rephones = re.findall(r'\d{3}-\d{3}-\d{4}', text)print(phones) # ['123-456-7890', '098-765-4321']
re.findall 返回所有匹配的字符串列表,是批量提取文本模式的利器。
2. 用 itertools.groupby 分组数据
刚学 Python 那会儿,谁还没写过这种又臭又长的分组代码?
data = [('A', 1), ('A', 2), ('B', 3), ('B', 4)]groups = {}for key, val in data: if key not in groups: groups[key] = [] groups[key].append(val)
后来我知道了 groupby,然后那段代码就进了回收站:
from itertools import groupbyfrom operator import itemgetter# 注意:数据必须先按分组键排序!for key, groupingroupby(data, key=itemgetter(0)): print(key, list(group))
groupby 将连续相同键的元素分组。
注意:它只分组相邻元素,使用前必须先排序。
3. 用 abc 定义抽象基类
别笑,这个错误我见过不下二十次:
class Shape: def area(self): raise NotImplementedError# 忘了实现 area 也不会报错(直到运行时调用)
正确的姿势应该让 Python 在门口就把人拦住:
from abc import ABC, abstractmethodclass Shape(ABC): @abstractmethod def area(self) -> float: ...# Shape() # TypeError: 不能实例化抽象类
ABC + abstractmethod 在实例化时就强制检查子类是否实现了所有抽象方法,比 NotImplementedError 更早发现问题。
4. 用 logging 替代 print 调试
不查文档的话,大部分人会这么干:
print('DEBUG: Starting process')print(f'INFO: Processing {filename}')# 上线时要删掉所有 print...
Pythonic 的写法长这样:
import logginglogging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] %(message)s')logger = logging.getLogger(__name__)logger.info('Processing file')logger.warning('Disk space low')logger.error('File not found')
logging 支持级别控制,通过配置决定输出哪些级别,无需删代码,还能输出到文件、设置格式。
5. 用 enum 定义枚举类型
最常见的写法大概是这样的:
STATUS_PENDING = 0STATUS_ACTIVE = 1STATUS_CLOSED = 2if status == 1: print('active')
换成这样就优雅多了:
from enum import Enum, autoclass Status(Enum): PENDING = auto() ACTIVE = auto() CLOSED = auto()if status == Status.ACTIVE: print('active')
Enum 让常量有类型、有名字、不可变,比裸常量更安全,不会拼错、不会比较不同类型的枚举。
速查表
| 场景 | 别这样写 | 试试这样 |
|---|
| 批量提取文本模式 | 手动解析循环 | re.findall() |
| 按键分组数据 | 手动字典分组 | itertools.groupby() |
| 定义接口规范 | raise NotImplementedError | ABC + @abstractmethod |
| 调试输出 | print() 到处写 | logging 级别控制 |
| 定义常量 | 裸数字/字符串 | Enum 枚举类 |
以上就是今天要安利的几个 Python 内置模块。
re.findall 让你告别手撕字符串,itertools.groupby 帮你把分组代码扔进历史垃圾桶,abc 让抽象类不再“抽象地出错”,Enum 把魔法数字赶出你的代码库。