杰瑞科技汇

Python Cookbook脚本如何高效解决实际编程问题?

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

Python Cookbook脚本如何高效解决实际编程问题?-图1
(图片来源网络,侵删)

数据结构

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 关键字。

Python Cookbook脚本如何高效解决实际编程问题?-图2
(图片来源网络,侵删)
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 模块。

Python Cookbook脚本如何高效解决实际编程问题?-图3
(图片来源网络,侵删)
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 中也有相应的“食谱”可供参考。

分享:
扫描分享到社交APP
上一篇
下一篇