10 个让代码立刻变短的 Python 小技巧
· 阅读需 4 分钟

大家好,我是村长,不好奇编程的站长。教 Python 这几年,我发现新手写的代码常常不是「错」,而是「绕」——明明一行能写完的东西,硬是铺了七八行。
今天挑 10 个我自己天天在用的小技巧,每个都能让代码短一截,而且不牺牲可读性。
1. 列表推导式:把 for 循环收成一行
最常见的场景:从一个列表里挑出符合条件的数,再逐个加工。
nums = [1, 2, 3, 4, 5, 6]
# 绕的写法
squares = []
for n in nums:
if n % 2 == 0:
squares.append(n * n)
# 村长写法
squares = [n * n for n in nums if n % 2 == 0]
print(squares) # -> [4, 16, 36]
记住顺序:表达式在前,for 在中,if 在后。
2. 字典推导式:顺便把字典也造了
words = ["python", "code", "tips"]
lengths = {w: len(w) for w in words}
print(lengths) # -> {'python': 6, 'code': 4, 'tips': 4}
需要反转字典时特别好用:{v: k for k, v in d.items()}。
3. f-string 里的等号:调试不用再拼字符串
Python 3.8 以后,f-string 支持在变量后加 =,变量名和值一起打印。
count = 42
total = 100
print(f"{count=}, {total=}, {count/total=:.1%}")
# -> count=42, total=100, count/total=42.0%
村长划重点:这是我最想让新手养成的一个习惯。以前写
print("count =", count),改变量名时经常忘了改字符串,现在不会了。
4. 海象运算符:算一次、用两次
:= 可以在表达式里顺便赋值,避免重复计算。
data = "python小技巧"
# 绕的写法
n = len(data)
if n > 5:
print(f"太长了:{n} 个字符")
# 村长写法
if (n := len(data)) > 5:
print(f"太长了:{n} 个字符")
别滥用,只在「真的省了一次计算」时用。
5. 多重赋值和交换
a, b = 1, 2
a, b = b, a # 交换,不需要临时变量
print(a, b) # -> 2 1
name, age, city = ("村长", 18, "杭州")
6. 星号解包:只拿你要的那几个
scores = [98, 87, 76, 65, 54]
first, *middle, last = scores
print(first, last, middle) # -> 98 54 [87, 76, 65]
head, *rest = ["标题", "第1行", "第2行", "第3行"]
7. enumerate:别再自己数下标了
lessons = ["变量", "循环", "函数", "类"]
for i, lesson in enumerate(lessons, start=1):
print(f"第{i}课:{lesson}")
start=1 让编号从 1 开始,不用在循环里加一。
8. zip:两个列表一起走
names = ["小明", "小红", "小刚"]
scores = [88, 95, 72]
for name, score in zip(names, scores):
print(f"{name}: {score}")
pairs = dict(zip(names, scores)) # 直接变字典
长度不一致时 zip 以短的为准;需要严格对齐就用 zip(..., strict=True)(Python 3.10 以上)。
9. any / all:判断交给内置函数
nums = [3, 6, 9, 12]
print(all(n % 3 == 0 for n in nums)) # -> True
print(any(n > 10 for n in nums)) # -> True
配合生成器表达式,写起来像一句人话,而且短路求值,找到答案就停。
10. 字典合并与默认值
defaults = {"theme": "light", "size": 14}
user = {"size": 18}
config = defaults | user # Python 3.9 以上,右边的覆盖左边
print(config) # -> {'theme': 'light', 'size': 18}
# 取不到就给默认值,别先 if 再索引
print(config.get("lang", "zh-CN"))
村长划重点:
dict.get()的默认值只在键不存在时生效;如果键存在但值是None,它不会兜底。这时候该用config.get("lang") or "zh-CN"。
小结
这 10 个技巧背后其实是同一件事:Python 把常见套路做成了语法或内置函数,你不必自己造轮子。
- 造新列表/字典 → 推导式
- 要下标 →
enumerate,要并行 →zip - 要判断 →
any/all - 要调试 → f-string 的
= - 要默认值 →
get/|
代码短不是目的,少一层嵌套、少一个中间变量才是。下次写完一段循环,先停下来问一句:这里是不是有更 Python 的写法?
我是村长,咱们下篇聊标准库里那些「早知道就好了」的工具。
