列表推导式

把"建一个列表"这件事浓缩成一行:

# 传统写法
squares = []
for x in range(10):
    squares.append(x ** 2)

# 推导式写法
squares = [x ** 2 for x in range(10)]
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

加条件过滤

even_squares = [x ** 2 for x in range(10) if x % 2 == 0]
# [0, 4, 16, 36, 64]

多个 for(嵌套)

pairs = [(x, y) for x in range(3) for y in range(3) if x != y]
# [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)]

⚠️ 嵌套两层就看不懂了——超过两层请用普通 for 循环。

字典推导式

# 数字 → 平方
sq = {x: x ** 2 for x in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# 反转字典
d = {"a": 1, "b": 2, "c": 3}
inv = {v: k for k, v in d.items()}

集合推导式

# 一段文字里的不同字符
s = {ch for ch in "hello world" if ch != " "}
# {'h', 'e', 'l', 'o', 'w', 'r', 'd'}

不存在"元组推导式"

(...) 会得到生成器,不是元组:

g = (x ** 2 for x in range(5))    # 生成器
list(g)    # [0, 1, 4, 9, 16]     才能看到值

要元组就用 tuple(...)

t = tuple(x ** 2 for x in range(5))

实战:把 list of dict 转成某字段的列表

users = [
    {"name": "Alice", "age": 30},
    {"name": "Bob", "age": 25},
    {"name": "Carol", "age": 35},
]

names = [u["name"] for u in users]
adults = [u for u in users if u["age"] >= 30]
name_to_age = {u["name"]: u["age"] for u in users}

这三种写法每天都会用到。

何时不要用推导式

  • 逻辑复杂(多个 if / 多层 for / 表达式很长)→ 用普通 for
  • 需要 try/except → 用普通 for
  • 只是想做副作用(比如 print)→ 用普通 for

推导式是构建集合的工具,不是"循环简写"。

下一篇进入函数——基础课程的下半场。