{T}

实用代码片段

本文档收集了一些常用的 Python 代码片段,可以帮助你在日常开发中提高效率。

基础数据结构操作

列表、字典、字符串、文件、JSON 等基础数据结构的详细教程见对应专题文档,这里仅列出最常用的速查要点,完整内容请查阅:

  • 列表操作(去重、推导式、过滤、排序)→ 09-列表与元组
  • 字典操作(合并、推导式、get、遍历)→ 10-字典
  • 字符串操作(多行、格式化、分割、连接)→ 08-字符串
  • 文件读写(读/写/追加、with 语句)→ 16-文件操作
  • JSON 处理json.dumps/loads/dump/load)→ 16-文件操作

常用速查

python
# 列表
list(set(x))                      # 去重
[x**2 for x in range(10)]         # 推导式
[x for x in range(10) if x % 2 == 0]  # 过滤
sorted(x, reverse=True)           # 排序

# 字典
d1.update(d2)                     # 合并
{x: x**2 for x in range(5)}       # 推导式
d.get('k', 'default')             # 安全取值
for k, v in d.items(): ...        # 遍历

# 字符串
f"欢迎来到 {name}"                # f-string
sentence.split()                  # 分割
", ".join(items)                  # 连接

# 文件(详见 19-文件操作)
with open('f.txt', 'r', encoding='utf-8') as f:
    content = f.read()

# JSON(详见 19-文件操作)
import json
json_str = json.dumps(data, indent=2)
data = json.loads(json_str)

异常处理速查

完整的异常处理教程见 15-异常处理。常用模式:

python
try:
    result = 10 / 0
except ZeroDivisionError:
    print("除零错误!")
except Exception as e:
    print(f"发生了错误: {e}")
finally:
    print("无论如何都会执行")

# 多个异常
try:
    ...
except (TypeError, ValueError) as e:
    print(f"类型或值错误: {e}")

日期时间

python
import datetime

# 获取当前时间
now = datetime.datetime.now()
print(f"当前时间: {now}")

# 格式化日期
formatted_date = now.strftime("%Y-%m-%d %H:%M:%S")
print(f"格式化日期: {formatted_date}")

# 解析日期字符串
date_str = "2023-12-25"
parsed_date = datetime.datetime.strptime(date_str, "%Y-%m-%d")

# 计算时间差
date1 = datetime.datetime(2023, 1, 1)
date2 = datetime.datetime(2023, 12, 31)
delta = date2 - date1
print(f"时间差: {delta.days} 天")

网络请求

python
import requests
import json

# GET 请求
response = requests.get('https://api.example.com/data')
if response.status_code == 200:
    data = response.json()
    print(json.dumps(data, indent=2))

# POST 请求
payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://api.example.com/submit', json=payload)
print(f"状态码: {response.status_code}")

数据处理

python
import pandas as pd

# 读取 CSV 文件
df = pd.read_csv('data.csv')

# 查看数据前几行
print(df.head())

# 数据筛选
filtered_data = df[df['column'] > 100]

# 数据聚合
grouped_data = df.groupby('category')['value'].mean()

# 数据导出
df.to_csv('output.csv', index=False)

异常处理

python
try:
    # 可能抛出异常的代码
    result = 10 / 0
except ZeroDivisionError:
    print("除零错误!")
except Exception as e:
    print(f"发生了错误: {e}")
finally:
    print("无论如何都会执行的代码")

# 多个异常处理
try:
    # 代码
except (TypeError, ValueError) as e:
    print(f"类型或值错误: {e}")

正则表达式

python
import re

# 匹配邮箱
email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
emails = re.findall(email_pattern, text)

# 替换文本
new_text = re.sub(r'Python', 'Py', text)

# 分割字符串
parts = re.split(r'[;,\s]\s*', text)

系统操作

python
import os
import sys
import subprocess

# 获取当前工作目录
current_dir = os.getcwd()

# 列出目录内容
files = os.listdir(current_dir)

# 创建目录
os.makedirs('new_folder', exist_ok=True)

# 执行系统命令
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)

# 获取命令行参数
args = sys.argv[1:]  # 排除脚本名称

环境变量

python
import os

# 获取环境变量
home_dir = os.environ.get('HOME')
print(f"用户主目录: {home_dir}")

# 设置环境变量
os.environ['MY_VAR'] = 'some_value'

# 检查环境变量是否存在
if 'PATH' in os.environ:
    print("PATH 环境变量存在")

JSON 处理

python
import json

# Python 对象转 JSON 字符串
data = {'name': 'Python', 'version': 3.9}
json_str = json.dumps(data, indent=2)

# JSON 字符串转 Python 对象
parsed_data = json.loads(json_str)

# 从文件读取 JSON
with open('data.json', 'r') as file:
    data = json.load(file)

# 写入 JSON 到文件
with open('output.json', 'w') as file:
    json.dump(data, file, indent=2)

日志记录

python
import logging

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    filename='app.log'
)

# 记录不同级别的日志
logging.debug("这是调试信息")
logging.info("这是普通信息")
logging.warning("这是警告信息")
logging.error("这是错误信息")
logging.critical("这是严重错误信息")

性能优化

python
import time
import functools

# 计时装饰器
def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} 执行时间: {end_time - start_time:.2f}秒")
        return result
    return wrapper

# 使用装饰器
@timer
def expensive_operation():
    # 模拟耗时操作
    time.sleep(2)
    return "操作完成"

# 缓存结果
@functools.lru_cache(maxsize=None)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

多线程与多进程

python
import threading
import multiprocessing

# 多线程示例
def worker(num):
    print(f"工作线程 {num} 正在运行")

threads = []
for i in range(5):
    t = threading.Thread(target=worker, args=(i,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

# 多进程示例
def process_worker(num):
    print(f"工作进程 {num} 正在运行")

processes = []
for i in range(5):
    p = multiprocessing.Process(target=process_worker, args=(i,))
    processes.append(p)
    p.start()

for p in processes:
    p.join()

数据类

python
from dataclasses import dataclass
from typing import List

# 定义数据类
@dataclass
class Person:
    name: str
    age: int
    hobbies: List[str] = None
    
    def __post_init__(self):
        if self.hobbies is None:
            self.hobbies = []

# 使用数据类
person = Person("Alice", 30, ["读书", "旅行"])
print(f"{person.name} 今年 {person.age} 岁")

Pythonic 编程惯例

Python 的"惯例"(idiom)即地道的 Python 写法。掌握这些模式,才能写出真正 Pythonic 的代码。

EAFP 优于 LBYL

  • EAFPEasier to Ask Forgiveness than Permission(请求原谅比请求许可容易)
  • LBYLLook Before You Leap(三思而后行)
python
d = {'x': '5'}

# 好:EAFP 风格
try:
    value = int(d['x'])
except (KeyError, TypeError, ValueError):
    value = None

# 不好:LBYL 风格 —— 防御性检查链
if 'x' in d and isinstance(d['x'], str) and d['x'].isdigit():
    value = int(d['x'])
else:
    value = None

利用真值判断

python
# 好
if name and fruits and owners:
    print('I love fruits!')

# 不好
if name != '' and len(fruits) > 0 and owners != {}:
    print('I love fruits!')

使用 in 运算符

python
name = 'Hao LUO'

# 好
if 'L' in name:
    print('The name has an L in it.')

# 不好
if name.find('L') != -1:
    print('This name has an L in it!')

不使用临时变量交换值

python
a, b = b, a

用 join 构建字符串

python
chars = ['j', 'a', 'c', 'k']
# 好
name = ''.join(chars)
# 不好
name = ''
for char in chars:
    name += char

使用 enumerate 迭代

python
fruits = ['orange', 'grape', 'pitaya', 'blueberry']

# 好
for index, fruit in enumerate(fruits):
    print(index, ':', fruit)

# 不好
index = 0
for fruit in fruits:
    print(index, ':', fruit)
    index += 1

使用 zip 组合键值创建字典

python
keys = ['1001', '1002', '1003']
values = ['骆昊', '王大锤', '白元芳']

# 好
d = dict(zip(keys, values))

# 不好
d = {}
for i, key in enumerate(keys):
    d[key] = values[i]

用推导式替代循环

python
data = [7, 20, 3, 15, 11]

# 好
result = [num * 3 for num in data if num > 10]

# 不好
result = []
for i in data:
    if i > 10:
        result.append(i * 3)

使用 if name == 'main'

python
# 让代码既可以被导入又可以被执行
if __name__ == '__main__':
    main()

这些代码片段涵盖了 Python 编程中的常见场景,可以作为日常开发的参考。记住,理解代码的工作原理比直接复制粘贴更重要!

版本差异(Python 3.8-3.12 → 3.14)

特性本文编写时Python 3.14
类型注解求值运行时立即求值PEP 649/749 延迟求值:注解不再在定义时执行,解决前向引用,提升启动性能
字符串模板普通 f-string / str.formatPEP 750 模板字符串 t"...":可插值且能被安全处理(3.14 新特性)
标准库多解释器无官方支持PEP 734:interpreter 模块支持在同一进程创建多个子解释器
调试仅 Python 内建 pdb / IDE 调试PEP 768:安全的 CPython 外部调试器接口(custom debugger protocol)
字节码与运行时3.12 前无 JIT3.13 引入实验性 JIT(PEP 744);3.14 进一步改进 free-threaded(无 GIL)构建
datetime APIutcnow() 常用3.12 起弃用,官方要求改用 datetime.now(tz=datetime.UTC)(aware 对象)
压缩算法zlib / gzip / bz2 / lzma3.14 新增标准库 Zstandard 支持(PEP 784)

本文讲解的语法与数据结构原理在 3.14 中依然成立;新项目建议基于 Python 3.13/3.14,并优先使用 aware datetime、PEP 649 注解与最新类型语法。