刚开始编写 Python 代码时,大家总会写出一堆“还行”的代码,但当代码量上升、问题逐渐增多,代码维护就成了头疼的事。原本清晰的逻辑也被一堆代码片段堆得杂乱无章。今天分享的这些 Python 技巧,不论你编程了几个月还是几年,都可以帮你显著提升代码质量。
让我们开始吧!
是否重复计算过同样的结果?用缓存可以大幅节省计算时间。Python 提供了 lru_cache
可以帮你记住结果,让你的代码更高效。
# 普通写法
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
# 使用缓存
from functools import lru_cache
@lru_cache
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
缓存后的斐波那契数列就像“打了鸡血”一样快!
还在用 os
模块处理文件路径?Pathlib
提供更简洁和跨平台的解决方案。
# 使用 os
import os
path = os.path.join("folder", "file.txt")
if os.path.exists(path):
os.remove(path)
# 使用 Pathlib
from pathlib import Path
path = Path("folder/file.txt")
if path.exists():
path.unlink()
专业提示:Pathlib 无缝兼容所有操作系统,代码更易维护。
处理大量数据时,与其创建完整的列表,不如用生成器,它能节省内存且运行更快。
# 使用列表推导式
squares = [x**2 for x in range(1000000)]
# 使用生成器
squares = (x**2 for x in range(1000000))
深复制对象通常耗时耗力,但 copyreg
允许你自定义对象复制方式,使之更加高效。
# 深复制
import copy
my_obj = copy.deepcopy(original_obj)
# 用 copyreg 优化
import copyreg
def pickle_my_class(obj):
return MyClass, (obj.value1, obj.value2)
copyreg.pickle(MyClass, pickle_my_class)
再也不担心深复制瓶颈了。
dataclass
可以自动生成 __init__
等常用方法,保持代码清晰整洁。
# 普通写法
class Employee:
def __init__(self, name, salary):
self.name = name
self.salary = salary
# 使用 dataclass
from dataclasses import dataclass
@dataclass
class Employee:
name: str
salary: float
冗长的多条件判断?用 any
和 all
让代码更简洁清晰。
# 普通写法
if (a > 5) and (b < 10) and (c == 20):
pass
# 简化
if all([a > 5, b < 10, c == 20]):
pass
快速创建简单的对象,可以用 SimpleNamespace
,让代码更清晰。
# 普通写法
class Config:
def __init__(self, host, port):
self.host = host
self.port = port
# 使用 SimpleNamespace
from types import SimpleNamespace
config = SimpleNamespace(host='localhost', port=8080)
operator
提供常用函数替代 lambda
,减少冗余代码。
# 使用 lambda
numbers = sorted(data, key=lambda x: x['age'])
# 使用 operator
from operator import itemgetter
numbers = sorted(data, key=itemgetter('age'))
defaultdict
让你无需检查字典键,节省大量代码。
# 手动检查键
word_count = {}
for word in words:
if word in word_count:
word_count[word] += 1
else:
word_count[word] = 1
# 使用 defaultdict
from collections import defaultdict
word_count = defaultdict(int)
for word in words:
word_count[word] += 1
默认的 __repr__
输出可能不直观。自定义 __repr__
让对象调试更方便。
class Car:
def __init__(self, model, year):
self.model = model
self.year = year
def __repr__(self):
return f"Car(model={self.model}, year={self.year})"
car = Car("Toyota", 2022)
print(car) # 输出: Car(model=Toyota, year=2022)
在多线程环境中,queue
模块可以保证线程安全地处理共享数据。
from queue import Queue
from threading import Thread
q = Queue()
def worker():
q.put(1)
threads = [Thread(target=worker) for _ in range(5)]
for t in threads:
t.start()
for t in threads:
t.join()
results = [q.get() for _ in range(q.qsize())]
Counter
可轻松统计列表中元素的出现次数,比手动计数简洁高效。
from collections import Counter
my_list = [1, 1, 2, 3, 2, 1]
count = Counter(my_list)
直接连接多个列表,不再需要手动循环。
from itertools import chain
for item in chain(list1, list2):
yield item
filterfalse
允许你直接过滤出 falsey 值,让代码更简洁。
from itertools import filterfalse
filtered_list = filterfalse(lambda x: x, some_list)
上下文管理器(with
语句)适合管理资源。你也可以自定义自己的上下文管理器,简化重复的清理工作。
# 处理文件
with open('data.txt') as file:
data = file.read()
# 自定义上下文管理器
from contextlib import contextmanager
@contextmanager
def my_context():
print("Before")
yield
print("After")
with my_context():
print("Doing something")
这些技巧将帮助你写出更整洁高效的 Python 代码。