实用代码片段
本文档收集了一些常用的 Python 代码片段,可以帮助你在日常开发中提高效率。
基础数据结构操作
列表、字典、字符串、文件、JSON 等基础数据结构的详细教程见对应专题文档,这里仅列出最常用的速查要点,完整内容请查阅:
常用速查:
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
- EAFP:Easier to Ask Forgiveness than Permission(请求原谅比请求许可容易)
- LBYL:Look 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.format | PEP 750 模板字符串 t"...":可插值且能被安全处理(3.14 新特性) |
| 标准库多解释器 | 无官方支持 | PEP 734:interpreter 模块支持在同一进程创建多个子解释器 |
| 调试 | 仅 Python 内建 pdb / IDE 调试 | PEP 768:安全的 CPython 外部调试器接口(custom debugger protocol) |
| 字节码与运行时 | 3.12 前无 JIT | 3.13 引入实验性 JIT(PEP 744);3.14 进一步改进 free-threaded(无 GIL)构建 |
datetime API | utcnow() 常用 | 3.12 起弃用,官方要求改用 datetime.now(tz=datetime.UTC)(aware 对象) |
| 压缩算法 | zlib / gzip / bz2 / lzma | 3.14 新增标准库 Zstandard 支持(PEP 784) |
本文讲解的语法与数据结构原理在 3.14 中依然成立;新项目建议基于 Python 3.13/3.14,并优先使用 aware datetime、PEP 649 注解与最新类型语法。