Python 教程 / 正则表达式 / 常用内建模块

常用内建模块

Python标准库提供了丰富的模块,无需额外安装即可使用。本章介绍最常用的日期时间容器迭代器哈希等模块。

datetime 日期时间模块

datetime 是Python处理日期和时间的核心模块。

┌─────────────────────────────────────────────────────────────────┐
│                    datetime 模块类结构                             │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│   datetime                                                     │
│   ├── date      - 日期(年、月、日)                            │
│   ├── time      - 时间(时、分、秒、微秒)                      │
│   ├── datetime  - 日期+时间                                    │
│   ├── timedelta - 时间间隔(用于计算)                          │
│   └── timezone  - 时区                                         │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
                         

1. date 类

Python
from datetime import date, datetime, timedelta

# 创建日期
today = date.today()
print(f"今天: {today}")           # 2026-01-15
print(f"年: {today.year}")          # 2026
print(f"月: {today.month}")         # 1
print(f"日: {today.day}")            # 15

# 创建特定日期
d = date(2026, 12, 25)
print(d)  # 2026-12-25

# 日期比较
d1 = date(2026, 1, 1)
d2 = date(2026, 12, 31)
print(d1 < d2)   # True 

2. datetime 类

Python
from datetime import datetime, timedelta

# 当前时间
now = datetime.now()
print(now)   # 2026-01-15 10:30:45.123456

# 创建特定时间
dt = datetime(2026, 6, 1, 12, 30, 0)
print(dt)   # 2026-06-01 12:30:00

# 格式化输出
print(now.strftime("%Y-%m-%d %H:%M:%S"))     # 2026-01-15 10:30:45
print(now.strftime("%Y年%m月%d日 %H:%M"))    # 2026年01月15日 10:30

# 解析字符串
dt_str = "2026-06-01 12:30:00"
parsed = datetime.strptime(dt_str, "%Y-%m-%d %H:%M:%S")
print(parsed)   # 2026-06-01 12:30:00 

3. timedelta 时间计算

Python
from datetime import datetime, timedelta

# 时间加减
now = datetime.now()
tomorrow = now + timedelta(days=1)
yesterday = now - timedelta(days=1)
print(f"明天: {tomorrow}")
print(f"昨天: {yesterday}")

# 时间差计算
dt1 = datetime(2026, 1, 1)
dt2 = datetime(2026, 1, 15)
diff = dt2 - dt1
print(f"相差天数: {diff.days}")   # 14
print(f"相差秒数: {diff.total_seconds()}")

# 实用示例:过期时间计算
expires = now + timedelta(hours=24)
print(f"24小时后过期: {expires}") 

collections 容器模块

1. Counter 计数器

Python
from collections import Counter

# 计数
cnt = Counter(["a", "b", "c", "a", "b", "a"])
print(cnt)   # Counter({'a': 3, 'b': 2, 'c': 1})
print(cnt["a"])   # 3

# 字符串计数
text = "hello world"
char_cnt = Counter(text)
print(char_cnt)   # Counter({'l': 2, 'o': 2, 'h': 1, 'e': 1, ...})

# 常用方法
print(cnt.most_common(2))   # [[('a', 3), ('b', 2)] - 最常见的2个
print(list(cnt.elements()))   # ['a', 'a', 'a', 'b', 'b', 'c'] 

2. defaultdict 默认值字典

Python
from collections import defaultdict

# 自动创建默认值
dd = defaultdict(int)
dd["count"] += 1   # 不需要先检查键是否存在
print(dd["count"])   # 1
print(dd["new"])    # 0 (自动创建,默认值)

# 列表型默认值 - 自动创建空列表
dd_list = defaultdict(list)
dd_list["fruits"].append("apple")
dd_list["fruits"].append("banana")
print(dd_list["fruits"])   # ['apple', 'banana']

# 分组统计
words = ["hello", "world", "hello", "python"]
grouped = defaultdict(list)
for word in words:
    grouped[word[0]].append(word)
print(dict(grouped))  # {'h': ['hello', 'hello'], 'w': ['world'], 'p': ['python']} 

3. namedtuple 命名元组

Python
from collections import namedtuple

# 定义命名元组类型
Point = namedtuple("Point", ["x", "y"])

# 创建实例
p = Point(10, 20)
print(p.x, p.y)           # 10 20
print(p[0], p[1])       # 10 20 (支持索引)
print(p._asdict())       # {'x': 10, 'y': 20}

# 学生记录
Student = namedtuple("Student", ["name", "age", "grade"])
s = Student("张三", 20, "A")
print(f"{s.name}, {s.age}岁, 等级{s.grade}") 

itertools 迭代器模块

1. 无限迭代器

Python
from itertools import count, cycle, repeat

# count - 无限计数器
for i, num in zip(range(5), count(10)):
    print(num, end=" ")   # 10 11 12 13 14

# cycle - 无限循环
for i, c in zip(range(6), cycle("AB")):
    print(c, end="")   # ABABAB

# repeat - 重复元素
print(list(repeat(5, 3)))   # [5, 5, 5] 

2. 组合迭代器

Python
from itertools import product, permutations, combinations

# product - 笛卡尔积
print(list(product("AB", "12")))    # [[('A', '1'), ('A', '2'), ('B', '1'), ('B', '2')]

# permutations - 排列
print(list(permutations("ABC", 2)))   # [[('A','B'), ('A','C'), ('B','A'), ('B','C'), ('C','A'), ('C','B')]

# combinations - 组合
print(list(combinations("ABC", 2)))   # [[('A','B'), ('A','C'), ('B','C')] 

3. chain 链接迭代器

Python
from itertools import chain

# 链接多个迭代器
combined = list(chain([1, 2], [3, 4], [5]))
print(combined)   # [1, 2, 3, 4, 5]

# 类似 sum 但用于拼接
# chain.from_iterable - 展平嵌套
nested = [[1, 2], [3, 4], [5]]
flattened = list(chain.from_iterable(nested))
print(flattened)   # [1, 2, 3, 4, 5] 

hashlib 哈希模块

hashlib 提供常见的哈希算法,用于密码存储、数据完整性验证等。

┌─────────────────────────────────────────────────────────────────┐
│                      哈希算法特点对比                               │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│   算法        输出长度    安全性    速度    典型用途            │
│   ─────────────────────────────────────────────────────         │
│   MD5        128位(16B)  低        快      数据校验(不推荐密码)  │
│   SHA-1      160位(20B)  中        快      数字签名(不推荐)      │
│   SHA-256    256位(32B)  高        中      密码、证书            │
│   SHA-512    512位(64B)  很高      慢      高安全需求            │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
                         
Python
import hashlib

# 基本哈希
msg = b"hello"
print(hashlib.md5(msg).hexdigest())
print(hashlib.sha1(msg).hexdigest())
print(hashlib.sha256(msg).hexdigest())
print(hashlib.sha512(msg).hexdigest())

# 字符串哈希(需编码)
text = "你好"
h = hashlib.sha256(text.encode("utf-8")).hexdigest()
print(h)

# 分块更新(适合大文件)
def hash_file(filepath):
    h = hashlib.sha256()
    with open(filepath, "rb") as f:
        for chunk in iter(lambda: f.read(1024), b""):
            h.update(chunk)
    return h.hexdigest()

# 带盐值的哈希(用于密码存储)
import secrets
salt = secrets.token_hex(16)
password = "my_password"
hashed = hashlib.pbkdf2_hmac("sha256", password.encode(), salt.encode(), 100000).hex()
print(f"盐值: {salt}")
print(f"哈希: {hashed}") 

random 随机模块

Python
import random

# 随机整数
print(random.randint(1, 100))      # 1-100 之间的随机整数
print(random.randrange(0, 101, 2))   # 0-100 之间的随机偶数

# 随机浮点数
print(random.random())           # 0-1 之间的随机浮点数
print(random.uniform(1, 10))     # 1-10 之间的随机浮点数

# 随机选择
fruits = ["apple", "banana", "orange", "grape"]
print(random.choice(fruits))        # 随机选择一个
print(random.sample(fruits, 2))     # 随机选择多个
random.shuffle(fruits)              # 打乱顺序

# 随机种子(可重现)
random.seed(42)
print(random.random())   # 每次 seed(42) 后结果相同 

os 和 sys 模块

os 模块 - 操作系统相关

Python
import os

# 路径操作
print(os.getcwd())              # 当前工作目录
print(os.path.exists("file.txt"))   # 文件是否存在
print(os.path.join("dir", "file.txt"))   # 路径拼接

# 目录操作
os.makedirs("new_dir", exist_ok=True)   # 创建目录
os.rmdir("empty_dir")                  # 删除空目录

# 文件信息
print(os.path.getsize("file.txt"))   # 文件大小(字节)
print(os.path.split("/path/to/file.txt"))  # 分割路径和文件名 

sys 模块 - Python解释器相关

Python
import sys

# Python版本
print(sys.version)
print(sys.executable)   # Python 解释器路径

# 模块搜索路径
print(sys.path)

# 命令行参数
# sys.argv[0] 是脚本名,argv[1:] 是传入的参数

# 退出程序
# sys.exit(0)  # 正常退出
# sys.exit(1)  # 异常退出

# stdin/stdout/stderr
sys.stdout.write("Hello stdout\n")
sys.stderr.write("Error message\n") 

知识测验

问题1:如何计算两天日期之间的天数差?

问题2:以下哪个适合存储用户密码?

课后练习

✏️ 练习1:日期计算器

实现一个日期计算器:

  • 计算给定日期是星期几
  • 计算两个日期之间的天数
  • 计算N天后的日期
  • 格式化输出各种日期格式
✏️ 练习2:单词统计

使用 Counter 实现单词统计:

  • 统计一段文本中单词出现频率
  • 找出最常见的5个单词
  • 使用 defaultdict 按首字母分组
✏️ 练习3:密码生成器

实现一个安全的密码生成器:

  • 生成指定长度的随机密码
  • 包含大小写字母、数字、特殊字符
  • 使用 secrets 模块生成安全随机数
🐍 Python 在线代码编辑器
📝 运行结果