Skip to content

Python标准库常用 API 速查 ​

学习目标 ​

  • 通过标准库解决日期、路径、文本、集合和命令行问题。
  • 了解 collections、itertools、functools、logging 等高频模块。
  • 选择标准库而不是重复造轮子的简单实现。

核心知识点 ​

标准库随 Python 一起发布,不需要额外安装。模块按职责拆分:collections 提供容器,itertools 提供迭代组合,datetime 处理时间,logging 记录诊断信息。不要为了“熟悉 API”而导入整个模块,按需导入并明确边界。

常用用法 ​

collections.Counter ​

python
from collections import Counter

counts = Counter("banana")
print(counts.most_common(2))
# 输出:[('a', 3), ('n', 2)]

计数、Top N 和多重集合运算优先用 Counter,比手写字典更清晰。

collections.defaultdict ​

python
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 ​

python
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() ​

python
from itertools import chain

result = list(chain([1, 2], (3, 4)))
print(result)
# 输出:[1, 2, 3, 4]

chain 惰性连接多个可迭代对象,适合逐段消费而无需先复制列表。

itertools.product() 与 combinations() ​

python
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 ​

python
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() ​

python
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

格式字符串要与输入严格匹配,外部时间还要明确时区。

python
import re

match = re.search(r"ID:(\d+)", "record ID:42")
print(match.group(1) if match else None)
# 输出:42

简单前缀和包含判断优先用字符串方法;正则表达式要使用原始字符串减少转义。

math.isclose() ​

python
import math

print(math.isclose(0.1 + 0.2, 0.3))
# 输出:True

浮点数比较使用容差;不要用 == 比较需要数值近似的结果。

logging ​

python
import logging

logger = logging.getLogger("demo")
logger.setLevel(logging.INFO)
print(logger.isEnabledFor(logging.INFO))
# 输出:True

库代码只创建 logger,不主动配置全局 handler;应用入口统一配置日志格式和级别。

不常用但需要知道 ​

functools.reduce() ​

python
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() ​

python
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 ​

python
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() ​

python
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。

课后小问 ​

  1. 为什么队列两端操作推荐 deque? 答案:deque 两端追加和弹出都适合队列,列表头部删除需要移动大量元素。 解析:数据结构选择应匹配操作复杂度,不要把列表当作高频双端队列。

  2. 应该用 print 还是 logging 记录长期运行服务的诊断信息? 答案:使用 logging。 解析:日志可以设置级别、时间格式、文件/控制台 handler,并由应用统一配置。

本节小结 ​

先查标准库,再考虑第三方依赖:容器用 collections,流用 itertools,时间用 datetime,诊断用 logging,安全随机用 secrets。

快速回顾 ​

  • 容器:Counter、defaultdict、deque
  • 迭代:chain、product、combinations
  • 时间:date、datetime、timedelta
  • 工程:argparse、logging
  • 安全:secrets,不要用 random 生成令牌