下面我将为你整理和展示一些来自《Python Cookbook》(尤其是第三版,涵盖 Python 3)中最常用、最核心的脚本示例,并按照主题进行分类,这些脚本可以直接作为你学习和开发的起点。

数据结构
1 解压序列赋值给多个变量
问题: 你有一个包含 N 个元素的元组或序列,想将它解压为 N 个单独的变量。 解决方案: Python 的序列赋值功能非常强大。
# 示例 1: 简单的元组解压
p = (4, 5)
x, y = p
print(x) # 输出: 4
print(y) # 输出: 5
# 示例 2: 解压列表
data = ['ACME', 50, 91.1, 'GOOG']
name, shares, price, symbol = data
print(f"Name: {name}, Shares: {shares}, Price: {price}")
# 示例 3: 解压可迭代对象(如字符串)
s = 'Hello'
a, b, c, d, e = s
print(a, e) # 输出: H o
# 示例 4: 忽略部分值
_, shares, price, _ = data # _ 是一个约定俗成的变量名,表示“丢弃”
print(f"Ignored name and symbol. Focus on shares: {shares}, price: {price}")
2 命名元组
问题: 你想创建一个字段很多的元组,但想通过名字而不是索引来访问字段。
解决方案: 使用 collections.namedtuple。
from collections import namedtuple
# 定义一个命名元组类型 'Stock'
Stock = namedtuple('Stock', ['name', 'shares', 'price', 'date', 'time'])
# 创建一个实例
stock_record = Stock(name='GOOG', shares=100, price=490.1,
date='2025-10-10', time='10:30am')
# 通过名字访问字段,就像访问对象的属性一样
print(stock_record.name) # 输出: GOOG
print(stock_record.shares) # 输出: 100
# 它仍然是元组,所以支持索引操作
print(stock_record[1]) # 输出: 100
3 字典排序
问题: 你想创建一个字典,并按键或值进行排序。
解决方案: 使用 sorted() 函数,并结合 zip() 或字典推导式。
# 原始字典
prices = {
'ACME': 45.23,
'AAPL': 612.78,
'IBM': 205.55,
'HPQ': 37.20,
'FB': 10.75
}
# 按键排序
sorted_keys = sorted(prices.keys())
print("Sorted keys:", sorted_keys)
# 按值排序 (从高到低)
sorted_values_desc = sorted(prices.items(), key=lambda item: item[1], reverse=True)
print("Sorted by value (desc):", sorted_values_desc)
# 创建一个按键排序的新字典
sorted_by_key = {k: prices[k] for k in sorted_keys}
print("New dict sorted by key:", sorted_by_key)
# 创建一个按值排序的新字典
sorted_by_value = dict(sorted_values_desc)
print("New dict sorted by value:", sorted_by_value)
4 查找字典的键或值
问题: 你需要查找字典中是否存在某个键或值。
解决方案: 使用 in 关键字。

prices = {'ACME': 45.23, 'AAPL': 612.78, 'IBM': 205.55}
# 检查键是否存在
print('ACME' in prices) # 输出: True
print('FB' in prices) # 输出: False
# 检查值是否存在 (需要遍历整个字典,效率较低)
print(612.78 in prices.values()) # 输出: True
# 对于频繁的值查找,可以创建一个值的反向查找字典
value_to_keys = {v: k for k, v in prices.items()}
print(value_to_keys) # 输出: {45.23: 'ACME', 612.78: 'AAPL', 205.55: 'IBM'}
print(45.23 in value_to_keys) # 输出: True
字符串与文本
1 使用 split() 和 join() 操作字符串
问题: 你需要分割或连接字符串。
解决方案: str.split() 用于分割,str.join() 用于连接。
# 分割
line = 'GOOG,100,490.10'
parts = line.split(',')
print(parts) # 输出: ['GOOG', '100', '490.10']
# 连接
data = ['GOOG', '100', '490.10']
joined_line = ','.join(data)
print(joined_line) # 输出: GOOG,100,490.10
2 在文本中查找和替换
问题: 你想在字符串中查找和替换子串。
解决方案: 使用 str.replace() 或 re.sub() (用于正则表达式)。
text = 'Yeah, Python is awesome. Python is easy.'
# 简单替换
new_text = text.replace('Python', 'C++')
print(new_text) # 输出: Yeah, C++ is awesome. C++ is easy.
# 使用正则表达式进行更复杂的替换 (只替换单词 "Python")
import re
new_text_regex = re.sub(r'\bPython\b', 'Go', text)
print(new_text_regex) # 输出: Yeah, Go is awesome. Go is easy.
3 检查字符串开头或结尾
问题: 你需要检查一个字符串是否以某个特定子串开头或结尾。
解决方案: 使用 str.startswith() 和 str.endswith()。
filename = 'report.txt'
if filename.endswith('.txt'):
print("It's a text file.")
if filename.startswith('report'):
print("It's a report file.")
# 也可以检查多个后缀
choices = ['.txt', '.pdf', '.docx']
if filename.endswith(tuple(choices)):
print("It's a common document file.")
日期与时间
1 解析和格式化日期字符串
问题: 你需要将日期字符串转换为 datetime 对象,或者反之。
解决方案: 使用 datetime 模块。

from datetime import datetime
# 字符串转 datetime 对象
date_str = '2025-10-26 10:30:00'
dt = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S')
print(dt) # 输出: 2025-10-26 10:30:00
print(type(dt)) # 输出: <class 'datetime.datetime'>
# datetime 对象转字符串
formatted_date = dt.strftime('%A, %B %d, %Y at %I:%M %p')
print(formatted_date) # 输出: Thursday, October 26, 2025 at 10:30 AM
2 执行日期计算
问题: 你需要对日期进行加减操作,比如计算 100 天后的日期。
解决方案: 使用 timedelta 对象。
from datetime import datetime, timedelta
now = datetime.now()
print("Today:", now)
# 计算 100 天后的日期
future_date = now + timedelta(days=100)
print("100 days from now:", future_date)
# 计算 2 小时 30 分钟后的时间
future_time = now + timedelta(hours=2, minutes=30)
print("2h 30m from now:", future_time)
# 计算两个日期之间的差
some_date = datetime(2025, 1, 1)
time_diff = now - some_date
print("Days since Jan 1, 2025:", time_diff.days)
迭代器与生成器
1 手动迭代一个序列
问题: 你想手动迭代一个序列,而不是使用 for 循环。
解决方案: 使用 iter() 和 next() 函数。
# iter() 函数返回一个迭代器对象 my_list = [1, 2, 3] it = iter(my_list) # next() 函数获取下一个元素 print(next(it)) # 输出: 1 print(next(it)) # 输出: 2 print(next(it)) # 输出: 3 # 如果没有更多元素,会抛出 StopIteration 异常 # print(next(it)) # 会报错
2 创建生成器
问题: 你想创建一个函数,它可以“暂停”并在稍后恢复执行,以产生一个序列的值。
解决方案: 在函数中使用 yield 关键字。
# 一个简单的生成器,用于产生斐波那契数列
def fibonacci(n):
a, b = 0, 1
while a < n:
yield a
a, b = b, a + b
# 使用生成器
fib = fibonacci(10) # 创建生成器对象,但不会立即执行
print(type(fib)) # 输出: <class 'generator'>
# for 循环会驱动生成器执行
for num in fib:
print(num, end=' ') # 输出: 0 1 1 2 3 5 8
文件与I/O
1 读写文本文件
问题: 你需要读写文本文件。
解决方案: 使用 with open(...) 语句,它会自动处理文件关闭。
# 写入文件
with open('my_file.txt', 'w') as f:
f.write('Hello, world!\n')
f.write('This is a test.\n')
# 读取文件
with open('my_file.txt', 'r') as f:
content = f.read()
print(content)
# 逐行读取文件
with open('my_file.txt', 'r') as f:
for line in f:
print(f"Read line: {line.strip()}") # .strip() 去除首尾空白字符
2 读取二进制文件
问题: 你需要读取图片、视频等二进制文件。
解决方案: 以 'rb' (read binary) 模式打开文件。
# 假设有一个名为 'image.png' 的图片文件
try:
with open('image.png', 'rb') as f:
data = f.read()
print(f"Read {len(data)} bytes of image data.")
except FileNotFoundError:
print("Error: image.png not found.")
函数
1 可变数量的参数
问题: 你想定义一个可以接受任意数量参数的函数。
解决方案: 使用 *args (用于位置参数) 和 **kwargs (用于关键字参数)。
# *args 接收一个元组
def sum_all(*args):
print(f"Arguments received: {args}")
return sum(args)
print(sum_all(1, 2, 3)) # 输出: 6
print(sum_all(10, 20, 30, 40)) # 输出: 100
# **kwargs 接收一个字典
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="Alice", age=30, city="New York")
# 输出:
# name: Alice
# age: 30
# city: New York
2 匿名函数 (Lambda)
问题: 你需要一个简单的、一次性的函数,不想用 def 定义它。
解决方案: 使用 lambda 表达式。
# 示例 1: 作为 sorted() 的 key 函数 points = [1, 5, -2, 10, 3] # 按绝对值排序 sorted_points = sorted(points, key=lambda x: abs(x)) print(sorted_points) # 输出: [1, -2, 3, 5, 10] # 示例 2: 作为 map() 的函数 numbers = [1, 2, 3, 4] squared = list(map(lambda x: x**2, numbers)) print(squared) # 输出: [1, 4, 9, 16]
这些脚本涵盖了《Python Cookbook》中最基础也是最核心的几个主题,你可以将这些代码片段复制到你的编辑器中,运行它们,并尝试修改它们,以加深理解,Cookbook 的精髓在于 “问题 -> 解决方案 -> 讨论” 的模式,所以当你遇到实际问题时,可以首先思考“我想要什么”,然后去查找或创造一个“解决方案”,最后理解“为什么这样工作”。
如果你想探索更高级的主题,比如元编程、并发、网络编程等,Cookbook 中也有相应的“食谱”可供参考。
