Python中那些让人相见恨晚的实用技巧

举报
yd_277754045 发表于 2026/10/13 21:33:22 2026/10/13
【摘要】 Python 中那些让人相见恨晚的实用技巧作为一名 Python 开发者,我们每天都在和这门语言打交道。但你是否发现,有些代码写起来总觉得"差点意思"?今天就来分享一些能让你效率翻倍的 Python 技巧,都是实战中总结出来的干货。 一、用 enumerate 替代 range(len())刚学 Python 时,很多人会这样写:items = ['apple', 'banana', 'c...

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! 🐍

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。