Python中那些让人相见恨晚的实用技巧
Python 中那些让人相见恨晚的实用技巧
作为一名 Python 开发者,我们每天都在和这门语言打交道。但你是否发现,有些代码写起来总觉得"差点意思"?今天就来分享一些能让你效率翻倍的 Python 技巧,都是实战中总结出来的干货。
一、用 enumerate 替代 range(len())
刚学 Python 时,很多人会这样写:
items = ['apple', 'banana', 'cherry']
for i in range(len(items)):
print(i, items[i])
但其实有更 Pythonic 的写法:
for i, item in enumerate(items):
print(i, item)
如果需要一个特定的起始索引,还能这样:
for i, item in enumerate(items, start=1):
print(i, item)
代码更简洁,可读性也更强。
二、字典合并的优雅姿势
在 Python 3.9 之前,合并两个字典通常用 update() 或 {**a, **b}。3.9+ 之后,有了更直观的运算符:
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
merged = dict1 | dict2
print(merged) # {'a': 1, 'b': 3, 'c': 4}
注意 b 的值被 dict2 覆盖了,这符合"后者优先"的直觉。
三、海象运算符:赋值表达式的妙用
Python 3.8 引入的海象运算符 := 可以让你在表达式内部完成赋值,特别适合处理需要重复计算的场景:
# 传统写法
data = get_data()
if data:
process(data)
# 海象运算符
if (data := get_data()):
process(data)
在循环中读取数据时尤其好用:
while (line := file.readline()) != '':
process(line)
四、collections 模块被低估的三件套
1. defaultdict:告别 KeyError
from collections import defaultdict
word_count = defaultdict(int)
for word in ['a', 'b', 'a', 'c', 'a']:
word_count[word] += 1
print(dict(word_count)) # {'a': 3, 'b': 1, 'c': 1}
不用再写 if key not in dict 这种样板代码了。
2. Counter:统计神器
from collections import Counter
words = ['apple', 'banana', 'apple', 'cherry', 'banana', 'apple']
counter = Counter(words)
print(counter.most_common(2)) # [('apple', 3), ('banana', 2)]
一行代码搞定词频统计,还自带排序。
3. deque:高效的双端队列
from collections import deque
# 用作固定长度的滑动窗口
window = deque(maxlen=3)
for i in range(6):
window.append(i)
print(list(window))
当新元素加入而队列已满时,会自动从另一端弹出,非常适合处理"最近 N 条记录"这类需求。
五、functools.lru_cache:一行代码搞定缓存
对于计算密集型的纯函数,加个装饰器就能大幅提速:
from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(100)) # 秒出结果
没有缓存的话,fibonacci(100) 可能要算到天荒地老。
六、用 pathlib 取代 os.path
处理文件路径时,pathlib 提供了面向对象的 API,比字符串拼接直观太多:
from pathlib import Path
# 传统写法
import os
path = os.path.join('data', 'raw', 'file.txt')
# pathlib 写法
path = Path('data') / 'raw' / 'file.txt'
# 读取所有 txt 文件
for txt_file in Path('data').glob('*.txt'):
print(txt_file.read_text())
跨平台兼容性也自动处理好了,Windows 和 Linux 上都能正常跑。
七、上下文管理器:不只是 with open()
任何需要"进入-退出"语义的场景,都可以自定义上下文管理器:
from contextlib import contextmanager
import time
@contextmanager
def timer(label):
start = time.perf_counter()
try:
yield
finally:
elapsed = time.perf_counter() - start
print(f'{label}: {elapsed:.4f}s')
with timer('数据处理'):
# 你的代码
sum(range(10**7))
用 contextmanager 装饰器配合 yield,几行代码就能搞定资源管理和性能监控。
八、__slots__:给对象"瘦身"
当需要创建大量对象时,用 __slots__ 可以显著减少内存占用:
class Point:
__slots__ = ('x', 'y')
def __init__(self, x, y):
self.x = x
self.y = y
相比普通类,每个实例可以省下几十字节。百万级对象时,节省的内存相当可观。
写在最后
Python 的魅力就在于,它总能用更少的代码表达更清晰的意图。上面这些技巧不一定每天都会用到,但当你真正遇到相应场景时,它们能帮你写出更优雅、更高效的代码。
建议挑一两个觉得有用的,在下次写代码时主动用起来。刻意练习几次,它们就会变成你的本能反应。
如果你也有自己的"私藏技巧",欢迎在评论区交流分享。
Happy Coding! 🐍
- 点赞
- 收藏
- 关注作者
评论(0)