Python标准库常用 API 速查
学习目标
- 通过标准库解决日期、路径、文本、集合和命令行问题。
- 了解
collections、itertools、functools、logging等高频模块。 - 选择标准库而不是重复造轮子的简单实现。
核心知识点
标准库随 Python 一起发布,不需要额外安装。模块按职责拆分:collections 提供容器,itertools 提供迭代组合,datetime 处理时间,logging 记录诊断信息。不要为了“熟悉 API”而导入整个模块,按需导入并明确边界。
常用用法
collections.Counter
from collections import Counter
counts = Counter("banana")
print(counts.most_common(2))
# 输出:[('a', 3), ('n', 2)]计数、Top N 和多重集合运算优先用 Counter,比手写字典更清晰。
collections.defaultdict
from collections import defaultdict
groups = defaultdict(list)
for name, team in [("Ada", "A"), ("Lin", "A"), ("Bo", "B")]:
groups[team].append(name)
print(dict(groups))
# 输出:{'A': ['Ada', 'Lin'], 'B': ['Bo']}分组时自动创建容器;读取不存在键会产生新键,要留意副作用。
collections.deque
from collections import deque
queue = deque(["a", "b"])
queue.append("c")
first = queue.popleft()
print(first, list(queue))
# 输出:a ['b', 'c']两端进出用 deque,不要用列表在头部反复 pop(0)。
itertools.chain()
from itertools import chain
result = list(chain([1, 2], (3, 4)))
print(result)
# 输出:[1, 2, 3, 4]chain 惰性连接多个可迭代对象,适合逐段消费而无需先复制列表。
itertools.product() 与 combinations()
from itertools import combinations, product
print(list(product(["A", "B"], [1, 2])))
# 输出:[('A', 1), ('A', 2), ('B', 1), ('B', 2)]
print(list(combinations([1, 2, 3], 2)))
# 输出:[(1, 2), (1, 3), (2, 3)]组合数量会指数增长,输入较大时要评估内存与时间。
datetime.date 与 timedelta
from datetime import date, timedelta
start = date(2026, 9, 27)
end = start + timedelta(days=7)
print(start.isoformat(), end.isoformat())
# 输出:2026-09-27 2026-10-04日期相加用 timedelta;时区相关的时间应使用带时区的 datetime。
datetime.strptime() 与 strftime()
from datetime import datetime
moment = datetime.strptime("2026-09-27 08:30", "%Y-%m-%d %H:%M")
print(moment.strftime("%Y/%m/%d %H:%M"))
# 输出:2026/09/27 08:30格式字符串要与输入严格匹配,外部时间还要明确时区。
re.search()
import re
match = re.search(r"ID:(\d+)", "record ID:42")
print(match.group(1) if match else None)
# 输出:42简单前缀和包含判断优先用字符串方法;正则表达式要使用原始字符串减少转义。
math.isclose()
import math
print(math.isclose(0.1 + 0.2, 0.3))
# 输出:True浮点数比较使用容差;不要用 == 比较需要数值近似的结果。
logging
import logging
logger = logging.getLogger("demo")
logger.setLevel(logging.INFO)
print(logger.isEnabledFor(logging.INFO))
# 输出:True库代码只创建 logger,不主动配置全局 handler;应用入口统一配置日志格式和级别。
不常用但需要知道
functools.reduce()
from functools import reduce
product_value = reduce(lambda left, right: left * right, [1, 2, 3, 4], 1)
print(product_value)
# 输出:24可读性通常不如 math.prod 或普通循环;只有折叠逻辑确实清晰时才使用。
operator.attrgetter()
from operator import attrgetter
class User:
def __init__(self, name: str) -> None:
self.name = name
users = [User("Lin"), User("Ada")]
print([user.name for user in sorted(users, key=attrgetter("name"))])
# 输出:['Ada', 'Lin']对对象属性排序时可复用 attrgetter,多级属性可传点号路径。
argparse.ArgumentParser
import argparse
parser = argparse.ArgumentParser(prog="report")
parser.add_argument("--format", choices=["text", "json"], default="text")
args = parser.parse_args([])
print(args.format)
# 输出:text命令行程序应让 argparse 负责帮助、默认值和错误提示,不要手写 sys.argv 解析。
secrets.token_urlsafe()
import secrets
token = secrets.token_urlsafe(8)
print(len(token) >= 10)
# 输出:True生成密码、会话令牌使用 secrets,不要用 random 代替;随机字符串具体内容不可预测,不应写死输出。
易混点
datetime默认对象可能没有时区信息,跨地区系统要显式处理 aware datetime。itertools多数函数返回一次性迭代器,调试时必要才list化。logging与print的目的不同:前者支持级别、路由和结构化配置。math.isclose用于近似相等,金额仍应考虑 Decimal。random不是安全随机数,令牌和密码使用secrets。
课后小问
为什么队列两端操作推荐
deque? 答案:deque两端追加和弹出都适合队列,列表头部删除需要移动大量元素。 解析:数据结构选择应匹配操作复杂度,不要把列表当作高频双端队列。应该用
print还是logging记录长期运行服务的诊断信息? 答案:使用logging。 解析:日志可以设置级别、时间格式、文件/控制台 handler,并由应用统一配置。
本节小结
先查标准库,再考虑第三方依赖:容器用 collections,流用 itertools,时间用 datetime,诊断用 logging,安全随机用 secrets。
快速回顾
- 容器:
Counter、defaultdict、deque - 迭代:
chain、product、combinations - 时间:
date、datetime、timedelta - 工程:
argparse、logging - 安全:
secrets,不要用random生成令牌
阿源的知识库