专项练习 · 7 分钟阅读

Python 列表推导式练习:映射、筛选与构建

推导式是构建集合的紧凑写法。真正该问的不是“能不能写短”,而是“转换是否仍然一眼可见”。

映射每个值

for 前面的表达式会为每个元素求值,结果是一个新列表。表达式要短到读者一眼能看出输入和输出。

nums = [1, 2, 3]
doubled = [n * 2 for n in nums]
print(doubled)

转换每个元素

先筛选,再转换

末尾的 if 子句只保留通过测试的值,条件放在 for 子句之后。如果条件需要多个分支,普通循环更合适。

nums = [1, 2, 3, 4]
even = [n for n in nums if n % 2 == 0]
print(even)

保留偶数值

构建字典

字典推导式在 for 前使用 键: 值。需要同时拿到原键和值时,遍历 items()。结果是新字典,不会修改原字典。

prices = {"latte": 4.5, "tea": 3.0}
expensive = {name: price for name, price in prices.items() if price >= 4}
print(expensive)

筛选字典

一个表达式里的嵌套循环

嵌套推导式从左到右读,就像嵌套的 for 循环。第一个 for 是外层循环。顺序不好解释时,先写普通循环再对比。

pairs = [(x, y) for x in [1, 2] for y in [3, 4]]
print(pairs)

小型的笛卡尔积

可读性优先于技巧

推导式应该替代循环,而不是把循环藏起来。如果表达式里需要注释,或者读者要读两遍,就改用命名函数或普通循环。短不等于清楚。

names = ["latte", "tea"]
labels = [name.upper() for name in names if len(name) > 3]
print(labels)

短而可读的筛选

你的练习清单

常见问题

推导式比循环快吗?

简单转换可能更快,但对初学者来说可读性更重要。只有性能真的成为问题时才做测量。

可以用推导式产生副作用吗?

可以,但含义不清楚。目标是打印、保存或修改外部状态时,用普通 for 循环。

列表推导式和生成器表达式有什么区别?

列表推导式会立即构建完整列表;生成器表达式按需产生值,处理大数据时可能更省内存。

练习推导式

12 道题,覆盖映射、筛选、字典推导式和嵌套循环。

打开练习

继续阅读: