第一章:引言——Python的“内置宝藏”
1.1 什么是Python标准库?
Python 被誉为“带着电池(batteries included)”的语言,这背后所指的正是其强大而全面的标准库(Standard Library)。它是一组随 Python 解释器一同安装的模块和包的集合,无需任何额外安装步骤(如 pip install),即可在您的代码中通过 import 关键字直接使用。从最简单的字符串操作到复杂的网络服务、从基础的数据结构到高级的并发编程,标准库提供了几乎所有通用编程场景的解决方案。
核心优势:
- 零依赖部署:这意味着您编写的一个基于标准库的脚本,可以在任何安装了相同版本 Python 的机器上直接运行,极大地简化了部署和分发流程。
- 性能与稳定性:标准库中的许多关键模块(如
json、math、pickle)的底层由 C 语言实现,性能优异。更重要的是,它们经过全球数百万开发者数十年的验证和锤炼,稳定性极高,bug 极少。 - 跨平台兼容:标准库为开发者屏蔽了底层操作系统的差异(Windows、Linux、macOS)。例如,
os.path.join会自动根据当前系统使用正确的路径分隔符(\或/),让您的代码轻松实现跨平台运行。
1.2 标准库的历史与演进
标准库并非一成不变,它随着 Python 语言本身的发展而不断进化,逐步淘汰老旧模块,引入现代化、更安全、更高效的新模块。
- Python 3.0 (2008) - 重大重构:这是 Python 历史上一次彻底的革新。标准库也经历了大规模清理和重命名,例如
ConfigParser被统一为configparser,Queue变为queue,并且引入了io模块来统一处理文本和二进制流,明确了str和bytes的区分。 - Python 3.4 - 3.6 - 现代化引入:这一时期为标准库注入了大量新鲜血液。
pathlib提供了面向对象的文件路径操作,asyncio带来了原生的异步 I/O 支持,typing开启了类型提示的时代,而dataclasses则让创建数据类变得前所未有的简单。 - Python 3.7 - 3.11 - 性能与安全:持续的性能优化是这一时期的主题。同时,标准库增加了
zoneinfo以提供对 IANA 时区的原生支持,tomllib用于解析 TOML 格式的配置文件,并逐步移除了过时且存在安全隐患的模块,如distutils(在 Python 3.12 中被移除)。
1.3 如何高效学习标准库
面对包含 200+ 核心模块(截至 Python 3.13+)的庞大库,我们不可能也不应该试图一次性记住所有内容。更高效的学习方法是:
- 构建认知地图:理解标准库的宏观分类(如文件处理、网络通信、数据处理等),知道每个分类下有哪些常用模块。当遇到新问题时,能快速定位到可能用到的模块。
- 从解决问题入手:不要死记硬背 API。而是在实际开发中(如“我想读取一个 CSV 文件”、“我需要发送一个 HTTP 请求”),带着问题去查找和学习对应的模块(如
csv、urllib.request)。 - 善用官方文档:Python 官方文档是最好的学习资源。它不仅有全面的模块索引,还提供了新手教程和详尽的语言参考。除此之外,优秀的第三方教程和学习指南也能帮助您快速上手。熟悉内置的
dir()和help()函数,它们是探索模块功能最快捷的命令行工具。 - 优先考虑标准库:在寻找解决方案时,请优先思考“Python 标准库是否已经提供了这个功能?”。这不仅能减少项目依赖和部署复杂性,还能确保您的代码更稳定、更易维护。
第二章:核心模块分类与实战应用
本章将按照功能领域,对标准库中最常用、最重要的模块进行系统性的介绍和实战演练。
2.1 操作系统与文件系统接口
这是与计算机底层交互的基础,几乎所有的 Python 程序都离不开它。
2.1.1 os 模块:操作系统的瑞士军刀
os 模块提供了与操作系统进行交互的丰富接口,涵盖了环境变量、进程管理、文件和目录操作等多个方面。不过,对于日常文件和目录管理,shutil 模块提供了更高级、更易用的接口。
核心功能示例:
import os
# 获取当前工作目录
current_dir = os.getcwd()
print(f"当前工作目录: {current_dir}") # 输出类似于 C:\Users\YourName\Project
# 切换工作目录
os.chdir('/path/to/new/directory')
# 创建目录(支持递归创建)
os.makedirs('data/logs/2024', exist_ok=True) # exist_ok=True 避免目录已存在时抛异常
# 列出目录下的所有文件和文件夹
for item in os.listdir('.'):
print(item)
# 获取环境变量
home_dir = os.environ.get('HOME', '/home/default') # 提供默认值以防变量不存在
print(f"Home 目录: {home_dir}")
# 执行系统命令(不推荐用于复杂任务,建议使用 subprocess)
os.system('echo "Hello from OS"')
最佳实践:官方强烈建议使用 import os 而非 from os import *,因为 os 模块中的某些函数(如 os.open())会覆盖内置函数 open(),导致难以排查的错误。
2.1.2 shutil 模块:高级文件操作
shutil 模块专注于文件、目录的高层次操作,如复制、移动、删除、归档等,是对 os 模块的有力补充。
import shutil
# 复制文件
shutil.copy2('source.txt', 'destination.txt') # copy2 会尽量保留元数据(修改时间等)
# 复制整个目录
shutil.copytree('backup_2023', 'archive/backup_2023')
# 移动文件或目录
shutil.move('temp_data.csv', 'processed/temp_data.csv')
# 删除整个目录(非空)
shutil.rmtree('obsolete_folder') # 危险操作,谨慎使用
# 创建归档文件(支持zip, tar等格式)
shutil.make_archive('project_backup', 'zip', 'my_project')
2.1.3 pathlib 模块:面向对象的路径操作(推荐)
自 Python 3.4 起引入的 pathlib 模块,被认为是文件路径处理的未来。它使用面向对象的方式,将路径封装为 Path 对象,比传统的 os.path 字符串操作更加直观、易用、不易出错。
from pathlib import Path
# 定义一个路径
p = Path('/usr/local/bin/python3')
print(p.name) # 文件名: python3
print(p.stem) # 不带后缀的文件名: python
print(p.suffix) # 文件后缀: .3
print(p.parent) # 父目录: /usr/local/bin
print(p.parents[8](@ref) # 上上级目录: /usr/local
# 构建新路径(使用 / 运算符)
config_path = Path.home() / '.config' / 'myapp' / 'config.ini'
print(config_path) # 类似于 /home/user/.config/myapp/config.ini
# 检查路径状态
if config_path.exists():
print("配置文件存在")
if config_path.is_file():
print("这是一个文件")
# 读写文件(最强大的特性之一)
file_path = Path('data.txt')
file_path.write_text('Hello, pathlib!', encoding='utf-8')
content = file_path.read_text(encoding='utf-8')
print(content) # 输出: Hello, pathlib!
# 遍历目录
for py_file in Path('.').glob('**/*.py'): # 递归查找所有 .py 文件
print(py_file)
为什么推荐 pathlib? 它为文件 I/O 提供了统一、清晰的接口,代码可读性更强,并且天然跨平台,无需担心路径分隔符的问题。除非维护旧代码,否则新项目应优先考虑 pathlib 而非 os.path。
2.2 文本处理与字符串操作
文本处理是编程中最常见的任务之一,标准库提供了从简单到复杂的全套工具。
2.2.1 re 模块:正则表达式引擎
当简单的字符串方法(如 str.find(), str.replace())无法满足复杂的模式匹配需求时,就需要 re 模块登场了。它提供了对正则表达式的完整支持,可用于文本搜索、替换、分割和提取。
import re
text = "我的联系方式是: 138-1234-5678 和 010-8765-4321"
# 查找所有符合模式的字符串 (findall)
phone_numbers = re.findall(r'\d{3}-\d{4}-\d{4}', text)
print(phone_numbers) # 输出: ['138-1234-5678', '010-8765-4321']
# 搜索第一个匹配项 (search)
match = re.search(r'(\d{3})-(\d{4}-\d{4})', text)
if match:
print(f"完整号码: {match.group(0)}") # 138-1234-5678
print(f"区号: {match.group(1)}") # 138
print(f"剩余部分: {match.group(2)}") # 1234-5678
# 替换 (sub)
masked_text = re.sub(r'\d{3}-\d{4}-\d{4}', '***-****-****', text)
print(masked_text) # 输出: 我的联系方式是: ***-****-**** 和 ***-****-****
# 分割 (split)
# 依据一个或多个空白字符或标点来分割
words = re.split(r'\s+|[,。、!?]', "你好,世界!这是一个测试。")
print(words) # 输出: ['你好', '世界', '这是一个测试', '']
性能提示:如果您需要在循环中多次使用同一个正则表达式,务必使用 re.compile() 对其进行预编译,这能显著提升性能。
pattern = re.compile(r'\d{3}-\d{4}-\d{4}')
for text in large_text_list:
pattern.findall(text) # 比 re.findall(pattern, text) 更快
2.2.2 textwrap 模块:文本排版利器
用于格式化文本段落,使其适应指定的宽度,常用于控制台输出或生成报告。
import textwrap
long_text = "Python标准库非常庞大,提供了许多组件。使用标准库我们可以轻松地完成各种任务。"
wrapped_text = textwrap.fill(long_text, width=30) # 每行最多30个字符
print(wrapped_text)
# 输出:
# Python标准库非常庞大,提供了
# 许多组件。使用标准库我们可以
# 轻松地完成各种任务。
2.2.3 difflib 模块:文本差异比较
提供计算文本序列差异的工具,并可以生成类似 Unix diff 命令的输出,或用于模糊字符串匹配。
import difflib
text1 = """Python标准库
包含了众多模块
功能强大"""
text2 = """Python 标准库
包含了极多模块
功能非常强大"""
# 生成差异报告
diff = difflib.unified_diff(text1.splitlines(), text2.splitlines(), lineterm='')
print('\n'.join(diff))
# 输出:
# ---
# +++
# @@ -1,3 +1,3 @@
# -Python标准库
# +Python 标准库
# -包含了众多模块
# +包含了极多模块
# -功能强大
# +功能非常强大
# 计算相似度
ratio = difflib.SequenceMatcher(None, "苹果", "苹果树").ratio()
print(f"相似度: {ratio:.2f}") # 输出: 0.67
2.3 数据结构与算法支持
除了内置的 list, dict, set, tuple,标准库还提供了更专业、更高效的数据结构。
2.3.1 collections 模块:扩展容器
这是最实用的模块之一,提供了许多内置容器的补充。
namedtuple:创建具有属性名称的元组,使代码更具可读性。deque:双端队列,从两端添加/删除元素的时间复杂度都是 O(1)。Counter:用于计数哈希对象的简单计数器。defaultdict:当键不存在时,自动调用工厂函数生成默认值。OrderedDict:在 Python 3.7+ 中,普通dict已保证插入顺序,但在某些需要明确顺序操作的场景下仍有用。
from collections import namedtuple, deque, Counter, defaultdict
# namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, y=20) # 允许位置参数和关键字参数
print(p.x, p.y) # 输出: 10 20
print(p[0] + p[8](@ref) # 仍可作为普通元组使用: 30
# deque
d = deque(['a', 'b', 'c'])
d.append('d')
d.appendleft('start')
print(d.pop()) # 输出: 'd'
print(d.popleft()) # 输出: 'start'
d.rotate(1) # 右旋一位, d 变为 ['c', 'a', 'b']
print(d)
# Counter
word_counts = Counter("abracadabra")
print(word_counts) # Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
print(word_counts.most_common(2)) # [('a', 5), ('b', 2)]
# defaultdict
groups = defaultdict(list) # 当键不存在时,自动创建一个空列表
groups['fruit'].append('apple')
groups['fruit'].append('banana')
groups['vegetable'].append('carrot')
print(groups) # defaultdict(<class 'list'>, {'fruit': ['apple', 'banana'], 'vegetable': ['carrot']})
2.3.2 heapq 模块:堆队列算法
提供了一个实现最小堆(min-heap)的算法,这使得我们可以在 O(log n) 的时间复杂度内进行插入和提取最小元素的操作。
import heapq
data = [3, 1, 4, 1, 5, 9, 2, 6]
# 使用 heapify 将列表转换为堆
heapq.heapify(data)
print(data) # 输出: [1, 1, 2, 3, 5, 9, 4, 6] (堆化后的顺序)
# 提取最小值
min_val = heapq.heappop(data)
print(min_val) # 1
# 插入新元素
heapq.heappush(data, 0)
print(data[1](@ref) # 现在堆顶是 0 (新的最小值)
# 获取前 n 个最大/最小元素
print(heapq.nlargest(2, data)) # [9, 6]
print(heapq.nsmallest(2, data)) # [0, 1]
应用场景:实现优先队列、查找流数据中的 Top K 元素、任务调度等。
2.3.3 bisect 模块:数组二分查找
维护一个已排序的列表,并使用二分查找来插入和查找元素,效率极高。
import bisect
sorted_list = [1, 3, 5, 7, 9]
# 查找插入点 (如果元素已存在,返回其右侧位置)
position = bisect.bisect_right(sorted_list, 5)
print(f"元素 5 应插入到索引 {position}") # 输出: 3
# 插入操作 (在保持有序的同时进行插入)
bisect.insort(sorted_list, 6)
print(sorted_list) # 输出: [1, 3, 5, 6, 7, 9]
2.4 日期与时间处理
正确处理时间和日期是一项挑战,标准库提供了 time 和 datetime 两个核心模块。
2.4.1 time 模块:底层时间访问
主要处理时间戳(自 Unix 纪元以来的秒数)、睡眠和格式化输出。
import time
# 获取当前时间戳
timestamp = time.time()
print(f"当前时间戳: {timestamp}")
# 将时间戳转换为结构化时间
struct_time = time.localtime(timestamp)
print(f"年: {struct_time.tm_year}, 月: {struct_time.tm_mon}, 日: {struct_time.tm_mday}")
# 格式化输出
formatted = time.strftime("%Y-%m-%d %H:%M:%S", struct_time)
print(f"格式化时间: {formatted}")
# 程序休眠
print("开始休眠...")
time.sleep(2) # 暂停 2 秒
print("休眠结束!")
# 测量代码执行时间
start = time.perf_counter()
# ... 执行一些代码 ...
end = time.perf_counter()
print(f"执行用时: {end-start:.4f} 秒")
2.4.2 datetime 模块:高级日期时间处理 (推荐)
datetime 模块提供了更面向对象、功能更全面的日期和时间处理能力,处理时区、时间差、日期运算等任务的首选。
from datetime import datetime, date, time, timedelta, timezone
# 获取当前日期时间
now = datetime.now()
today = date.today()
print(f"当前时间: {now}")
print(f"今天日期: {today}")
# 创建特定日期
birthday = datetime(1990, 5, 15, 8, 30, 0)
# 日期运算
delta = now - birthday
print(f"距离生日过去了 {delta.days} 天")
# 未来/过去日期预测
future = now + timedelta(days=10, hours=2)
print(f"10天2小时后是: {future}")
# 格式化与解析
date_str = "2024-08-15 14:30:00"
parsed_date = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print(f"解析后的对象: {parsed_date}")
formatted = parsed_date.strftime("%A, %B %d, %Y") # 输出: 周几, 月 日, 年
print(f"美式格式: {formatted}")
# 时区处理 (Python 3.9+ 推荐使用 zoneinfo)
# 假设我们需要知道上海的时间
from zoneinfo import ZoneInfo
shanghai_tz = ZoneInfo("Asia/Shanghai")
shanghai_time = datetime.now(shanghai_tz)
print(f"上海当前时间: {shanghai_time}")
2.5 数据持久化与文件格式
Python 标准库支持从简单的文本文件到复杂的数据库,再到各种配置文件格式。
2.5.1 json 模块:数据交换的通用语言
JSON 是目前 Web 和配置领域最流行的数据格式之一。json 模块可以轻松地在 Python 对象和 JSON 字符串之间进行转换。
import json
# Python 对象 -> JSON 字符串 (序列化)
data = {
"name": "Python 标准库",
"version": 3.12,
"features": ["文件处理", "网络通信", "并发"],
"is_complete": True
}
json_string = json.dumps(data, indent=2, ensure_ascii=False) # indent 美化输出,ensure_ascii 支持中文
print(json_string)
# JSON 字符串 -> Python 对象 (反序列化)
parsed_data = json.loads(json_string)
print(parsed_data['name']) # 输出: Python 标准库
# 从文件读写
with open('config.json', 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2)
with open('config.json', 'r', encoding='utf-8') as f:
loaded_data = json.load(f)
2.5.2 csv 模块:读写电子表格
用于读写逗号分隔值(CSV)文件,这是数据分析和自动化任务中最常见的文件格式之一。
import csv
# 写入 CSV
header = ['姓名', '年龄', '城市']
rows = [
['Alice', 30, '北京'],
['Bob', 25, '上海'],
['Carol', 35, '广州']
]
with open('people.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(header)
writer.writerows(rows)
# 读取 CSV
with open('people.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row) # 每行是一个列表
2.5.3 configparser 模块:解析 INI 配置文件
用于读写类似 Windows INI 文件的配置文件,非常适合管理应用程序的配置项。
; config.ini
[DEFAULT]
ServerAliveInterval = 45
Compression = yes
ForwardX11 = yes
[forge.example]
User = hg
[topsecret.server.example]
Port = 50022
ForwardX11 = no
import configparser
config = configparser.ConfigParser()
config.read('config.ini')
# 读取配置
print(config['forge.example']['User']) # 输出: hg
print(config['DEFAULT']['Compression']) # 输出: yes
print(config.getint('topsecret.server.example', 'Port')) # 输出: 50022 (作为整数)
2.5.4 sqlite3 模块:轻量级数据库
提供了一个对 SQLite 数据库的 DB-API 2.0 接口,SQLite 是一个轻量级、跨平台、无需服务器的关系型数据库,非常适合嵌入式应用和快速原型开发。
import sqlite3
# 连接数据库(文件不存在会自动创建)
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
# 创建表
cursor.execute('''CREATE TABLE IF NOT EXISTS users
(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)''')
# 插入数据
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 30))
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Bob', 25))
conn.commit() # 提交事务
# 查询数据
cursor.execute("SELECT * FROM users WHERE age > ?", (20,))
rows = cursor.fetchall()
for row in rows:
print(row) # (1, 'Alice', 30) (2, 'Bob', 25)
# 关闭连接
conn.close()
2.6 数学与随机数
标准库提供了从基础数学运算到高级统计的广泛支持。
2.6.1 math 模块:基础数学函数
提供对底层 C 数学库的访问,包括三角函数、对数、幂运算、常数(π, e)等。
import math
print(math.pi) # 3.141592653589793
print(math.e) # 2.718281828459045
print(math.sqrt(16)) # 4.0
print(math.sin(math.pi / 2)) # 1.0
print(math.log(1024, 2)) # 10.0
print(math.ceil(3.2)) # 4 (向上取整)
print(math.floor(3.8)) # 3 (向下取整)
2.6.2 random 模块:生成伪随机数
注意:random 模块生成的是伪随机数,适用于模拟、游戏、测试等场景。对于安全性要求高的场景(如密码生成),请使用 secrets 模块。
import random
# 基本随机数
print(random.random()) # 0.0 到 1.0 之间的浮点数
print(random.uniform(10, 20)) # 10.0 到 20.0 之间的浮点数
print(random.randint(1, 6)) # 1 到 6 之间的整数(包括1和6),模拟掷骰子
print(random.randrange(0, 101, 10)) # 从 range(0, 101, 10) 中随机选一个
# 从序列中选择
items = ['apple', 'banana', 'cherry']
print(random.choice(items)) # 随机选择一个元素
print(random.sample(items, 2)) # 随机选择2个不重复的元素(无放回抽样)
print(random.choices(items, k=10)) # 随机选择10个元素(有放回抽样)
# 打乱序列
deck = list(range(52))
random.shuffle(deck)
print(deck[:5]) # 随机排列后的前5张牌
2.6.3 statistics 模块:数学统计
用于基本的统计计算,如均值、中位数、众数、标准差等。
import statistics
data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
print(statistics.mean(data)) # 1.6071428571428572 (均值)
print(statistics.median(data)) # 1.25 (中位数)
print(statistics.mode(data)) # 1.25 (众数)
print(statistics.stdev(data)) # 1.1442820787255006 (样本标准差)
2.7 网络通信
标准库支持从底层 socket 到高层 HTTP 协议的完整网络栈。
2.7.1 urllib 包:URL 处理
一个用于处理 URL 相关任务的模块集合,最常用的是 urllib.request 用于打开和读取 URL。
import urllib.request
import urllib.parse
# 获取网页内容 (GET 请求)
with urllib.request.urlopen('https://api.example.com/data') as response:
html = response.read()
print(f"状态码: {response.status}")
# 如果是 JSON 响应,可以解码
# import json; data = json.loads(html.decode('utf-8'))
# 发送 POST 请求
data = urllib.parse.urlencode({'key1': 'value1', 'key2': 'value2'}).encode('utf-8')
req = urllib.request.Request('https://httpbin.org/post', data=data, method='POST')
with urllib.request.urlopen(req) as response:
print(response.read().decode('utf-8'))
2.7.2 http.server 模块:简易 Web 服务器
可以快速启动一个简易的 HTTP 服务器,常用于共享文件或测试静态页面。
# 命令行中,在当前目录启动一个 HTTP 服务,监听默认端口 8000
python -m http.server 8000
2.7.3 smtplib 模块:发送邮件
用于发送电子邮件的 SMTP 协议客户端库。
import smtplib
from email.message import EmailMessage
msg = EmailMessage()
msg.set_content("这是一封来自 Python 的测试邮件。")
msg['Subject'] = 'Python 邮件测试'
msg['From'] = 'sender@example.com'
msg['To'] = 'receiver@example.com'
# 连接到邮件服务器 (示例使用 Gmail 的 SMTP 服务器)
try:
with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server:
server.login('your_email@gmail.com', 'your_app_password') # 使用应用专用密码
server.send_message(msg)
print("邮件发送成功!")
except Exception as e:
print(f"邮件发送失败: {e}")
2.8 日志与调试
专业的程序离不开完善的日志系统和调试工具。
2.8.1 logging 模块:专业的日志系统
logging 模块是 print() 语句的强大替代品,它提供了灵活的日志级别、格式化输出以及将日志写入文件、网络等目标的能力。
import logging
# 基础配置
logging.basicConfig(
level=logging.DEBUG, # 设置日志级别,低于此级别的日志不会输出
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename='app.log', # 将日志写入文件
filemode='a' # 追加模式
)
# 不同级别的日志
logging.debug("这是一条调试信息,通常只在开发时使用。")
logging.info("这是一条普通信息,记录了程序的正常运行状态。")
logging.warning("这是一条警告信息,表示可能存在问题。")
logging.error("这是一条错误信息,表示程序遇到了问题。")
logging.critical("这是一条严重错误信息,表示程序可能无法继续运行。")
# 使用更简单的打印风格
# logging.basicConfig(level=logging.INFO, format='%(message)s')
2.8.2 pdb 模块:交互式调试器
Python 自带的调试器,允许您逐步执行代码、检查变量、设置断点等。
import pdb
def complex_function(a, b):
result = a + b
pdb.set_trace() # 程序执行到这里会进入交互式调试模式
# 在调试模式下,可以输入 c (继续), s (单步进入), n (单步跳过), p (打印变量) 等命令
result = result * 2
return result
result = complex_function(3, 4)
print(result)
2.8.3 timeit 模块:精准计时
用于测量小段代码的执行时间,是性能测试的利器。
import timeit
# 测量一条语句的执行时间
code_to_test = """
a = [i for i in range(1000)]
b = [i*2 for i in a]
"""
execution_time = timeit.timeit(code_to_test, number=10000) # 执行 10000 次
print(f"执行 10000 次用时: {execution_time:.4f} 秒")
# 比较两种方法的性能
print(timeit.timeit('"-".join(str(n) for n in range(100))', number=10000))
print(timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000))
2.9 并发与并行
Python 支持多种并发编程模型,以适应不同的场景。
- 多线程 (
threading):适合 I/O 密集型任务(如网络请求、文件读写),利用等待 I/O 的时间执行其他任务。 - 多进程 (
multiprocessing):适合 CPU 密集型任务(如复杂计算、图像处理),利用多核 CPU 的并行计算能力。 - 异步 I/O (
asyncio):适合高并发 I/O 密集型任务(如 Web 服务器、爬虫),通过单一事件循环在单线程内并发处理大量任务。
2.9.1 threading 模块:多线程
import threading
import time
def worker(name, delay):
print(f"线程 {name} 启动")
time.sleep(delay)
print(f"线程 {name} 完成")
# 创建线程
threads = []
for i in range(3):
t = threading.Thread(target=worker, args=(f"Thread-{i}", i))
threads.append(t)
t.start()
# 等待所有线程完成
for t in threads:
t.join()
print("所有线程执行完毕")
2.9.2 concurrent.futures 模块:高级并发接口
提供了更高级别的抽象,让我们可以方便地使用线程池和进程池。
from concurrent.futures import ThreadPoolExecutor, as_completed
import urllib.request
urls = ['https://httpbin.org/delay/1', 'https://httpbin.org/delay/2', 'https://httpbin.org/delay/3']
def fetch_url(url):
with urllib.request.urlopen(url, timeout=5) as response:
return url, response.status
# 使用线程池并发抓取
with ThreadPoolExecutor(max_workers=5) as executor:
# 提交所有任务
future_to_url = {executor.submit(fetch_url, url): url for url in urls}
# 按完成顺序获取结果
for future in as_completed(future_to_url):
url, status = future.result()
print(f"{url} 完成,状态码: {status}")
第三章:标准库的未来发展与最佳实践
3.1 发展方向
标准库会随 Python 一起持续进化,未来的发展重点包括:
- 现代化重构:逐步用更直观、面向对象的新模块替代老旧的过程式模块。最典型的例子是
pathlib逐步取代os.path的工作正在进行中。 - 性能提升:关键模块(如
json、pickle、math)的底层会持续采用 C 实现或优化算法,以获得更好的性能。 - 安全增强:加强
hashlib、ssl、secrets等安全相关模块的默认配置,为开发者提供更安全的默认选项。 - 异步化:逐步为更多 I/O 密集型模块提供原生
asyncio支持,使标准库更好地适应高并发网络编程的需求。 - 类型提示支持:为标准库全面添加类型注解,提升 IDE 支持、代码可读性和运行安全性。
- 精简与安全:移除不再维护或存在安全隐患的模块(如
distutils),并推荐使用更现代的替代方案。
3.2 核心使用原则
- 优先使用标准库:这是最重要的原则。在引入第三方库之前,先检查标准库是否能满足需求。这能显著降低项目复杂性和部署风险。
- 理解而非死记:面对 200+ 个模块,重点不是记住所有 API,而是知道每个功能领域有哪些核心模块,以及如何查阅官方文档。
- 注意模块的弃用:学习时尽量基于 Python 的最新稳定版本(现在是 3.14+),了解模块的生命周期,避免使用已弃用或计划移除的模块。官方文档的“弃用”章节会列出不推荐使用的功能。
- 善用社区资源:虽然标准库本身稳定,但最佳实践会不断演进。关注 PEP(Python 增强提案)和社区博客,了解新的模块和更优的使用方法。
附录:常见模块速查表
| 功能领域 | 核心模块 | 简要说明 | 初学优先级 |
|---|---|---|---|
| 操作系统接口 | os, shutil, pathlib | 文件、目录、环境变量、进程操作 | ⭐⭐⭐⭐⭐ |
| 文本处理 | re, string, textwrap | 正则表达式、文本常量、格式化 | ⭐⭐⭐⭐⭐ |
| 数据结构 | collections, heapq, bisect | 扩展容器、堆、二分查找 | ⭐⭐⭐⭐ |
| 日期时间 | datetime, time, calendar | 日期时间对象、时间戳、日历 | ⭐⭐⭐⭐⭐ |
| 数据持久化 | json, csv, sqlite3, pickle | 数据序列化、文件读写、轻量数据库 | ⭐⭐⭐⭐⭐ |
| 数学与随机 | math, random, statistics | 数学函数、伪随机数、统计计算 | ⭐⭐⭐⭐ |
| 命令行交互 | sys.argv, argparse, getpass | 参数解析、密码输入 | ⭐⭐⭐ |
| 网络通信 | urllib, http, smtplib, socket | URL 请求、HTTP 服务、邮件发送 | ⭐⭐⭐⭐ |
| 并发与并行 | threading, multiprocessing, asyncio | 线程、进程、异步 I/O | ⭐⭐⭐ |
| 日志与测试 | logging, unittest, pdb, doctest | 日志记录、单元测试、调试 | ⭐⭐⭐⭐ |
| 数据压缩 | zlib, gzip, zipfile, tarfile | 数据打包与压缩 | ⭐⭐ |
| 加密服务 | hashlib, hmac, secrets | 哈希、消息认证、安全随机数 | ⭐⭐⭐ |
1236

被折叠的 条评论
为什么被折叠?



