用一行代码,描述'如何从一个集合生成另一个集合'。
一、最基础形式
传统写法
python
result = []
for x in range(10):
result.append(x * 2)
列表推导式
python
result = [x * 2 for x in range(10)]
👉 可读性 + 简洁度 + 性能,都更好
range是什么?
range 是 Python 内置的"序列生成器"类型,不是关键字,是一个 内置类(type)。
作用:用来生成一段"整数序列",通常配合 for 循环 / 推导式使用。
py
range(start, stop, step)
# 从 start 开始
# 每次加 step
# 直到但不包含 stop
二、基本语法结构(记住这个模板)
python
[表达式 for 变量 in 可迭代对象]
例子:
python
[x ** 2 for x in [1, 2, 3, 4]]
三、加条件(非常常用)
1️⃣ 过滤条件(if 在后)
python
[x for x in range(10) if x % 2 == 0]
👉 含义:
"从 0~9 中,取所有偶数"
2️⃣ 条件表达式(三元运算)
python
["even" if x % 2 == 0 else "odd" for x in range(5)]
👉 注意顺序:
python
[结果 if 条件 else 结果 for x in ...]
⚠️ 很多人写反
四、嵌套循环(等价双重 for)
python
pairs = [(x, y) for x in [1, 2] for y in [3, 4]]
# [(1, 3), (1, 4), (2, 3), (2, 4)]
等价于:
python
pairs = []
for x in [1, 2]:
for y in [3, 4]:
pairs.append((x, y))
👉 顺序 从左到右
五、常见"高级用法"(工程里真的用)
1️⃣ 字符串处理
python
names = [" Tom ", "Jerry ", " spike"]
clean = [name.strip().title() for name in names]
# ['Tom', 'Jerry', 'Spike']
2️⃣ 类型转换
python
nums = ["1", "2", "3"]
nums = [int(x) for x in nums]
# [1, 2, 3]
3️⃣ 扁平化二维列表
python
matrix = [[1, 2], [3, 4], [5, 6]]
flat = [x for row in matrix for x in row]
# [1, 2, 3, 4, 5, 6]
4️⃣ 过滤 None / 空值
python
data = [1, None, 2, "", 3]
clean = [x for x in data if x]
六、不只是列表:推导式家族
Python 有 4 种推导式:
1️⃣ 列表推导式
python
[x for x in range(5)]
2️⃣ 集合推导式
python
{x for x in [1, 2, 2, 3]}
3️⃣ 字典推导式
python
{k: v for k, v in [("a", 1), ("b", 2)]}
4️⃣ 生成器表达式(省内存)
python
(x * 2 for x in range(10))
👉 不是列表,是惰性计算
七、性能 & 可读性(非常关键)
为什么比 for + append 快?
- 内部实现更优化
- 减少 Python 层函数调用
但不是越复杂越好
❌ 不推荐:
python
[x for x in data if x > 0 if x % 2 == 0 if x < 100]
✅ 推荐拆开:
python
result = []
for x in data:
if x > 0 and x % 2 == 0 and x < 100:
result.append(x)
👉 可读性永远第一
八、什么时候不该用列表推导式?
❌ 以下情况请用普通 for:
- 多行逻辑
- 有 try / except
- 有复杂 if / else
- 有副作用(打印、写文件)