Python3 推导式
列表、字典、集合推导式与生成器表达式的写法、嵌套与性能取舍。
列表推导式
Syntax: [expr for var in iterable if cond], allowing several for clauses and conditions. It is faster than a manual loop and reads as "what I want" instead of "how to build it".
print([x ** 2 for x in range(5)])
print([x for x in range(10) if x % 2 == 0])
print([x if x > 0 else 0 for x in (-2, 3, -1, 4)])
print([(x, y) for x in range(2) for y in range(2)])
print([[x * y for y in range(3)] for x in range(2)])[0, 1, 4, 9, 16]
[0, 2, 4, 6, 8]
[0, 3, 0, 4]
[(0, 0), (0, 1), (1, 0), (1, 1)]
[[0, 0, 0], [0, 1, 2]]字典推导式
Build dicts with {key_expr: value_expr for ...}. Typical uses: swapping keys and values, renaming keys by rule, or zipping two sequences.
print({x: x ** 2 for x in range(4)})
print({v: k for k, v in {'a': 1, 'b': 2}.items()})
print({k: v for k, v in {'a': 1, 'b': 2}.items() if v > 1})
print(dict(zip(['x', 'y'], [1, 2]))){0: 0, 1: 1, 2: 4, 3: 9}
{1: 'a', 2: 'b'}
{'b': 2}
{'x': 1, 'y': 2}集合推导式
A set comprehension uses {expr for ...} and deduplicates automatically. Note {} is an empty dict; write set() for an empty set.
print({x % 3 for x in range(10)})
print(sorted({c.lower() for c in 'AbcABC'}))
print(len({x // 2 for x in range(10)})){0, 1, 2}
['a', 'b', 'c']
5元组推导式(生成器表达式)
There is no tuple comprehension — parentheses produce a generator expression, lazily evaluated, single-pass, with constant memory. Wrap in tuple() when you really need a tuple.
g = (x ** 2 for x in range(5))
print(type(g).__name__)
print(sum(g))
print(sum(g))
print(tuple(x for x in range(3)))
print(max(x for x in range(5)))generator
30
0
(0, 1, 2)
4sum(g) returns 0 because the iterator is exhausted. Store a list if you need to iterate more than once.列表推导式
语法 [表达式 for 变量 in 可迭代对象 if 条件],可以嵌套多个 for、多个 if。它比手写循环快,也更接近「声明要什么」而不是「怎么做」。
print([x ** 2 for x in range(5)])
print([x for x in range(10) if x % 2 == 0])
print([x if x > 0 else 0 for x in (-2, 3, -1, 4)])
print([(x, y) for x in range(2) for y in range(2)])
print([[x * y for y in range(3)] for x in range(2)])[0, 1, 4, 9, 16]
[0, 2, 4, 6, 8]
[0, 3, 0, 4]
[(0, 0), (0, 1), (1, 0), (1, 1)]
[[0, 0, 0], [0, 1, 2]]字典推导式
用 {键表达式: 值表达式 for ...} 构造字典。常见用途是键值互换、按规则重命名键、从两个序列配对。
print({x: x ** 2 for x in range(4)})
print({v: k for k, v in {'a': 1, 'b': 2}.items()})
print({k: v for k, v in {'a': 1, 'b': 2}.items() if v > 1})
print(dict(zip(['x', 'y'], [1, 2]))){0: 0, 1: 1, 2: 4, 3: 9}
{1: 'a', 2: 'b'}
{'b': 2}
{'x': 1, 'y': 2}集合推导式
用 {表达式 for ...} 得到集合,天然去重。注意 {} 是空字典,空集合要写 set()。
print({x % 3 for x in range(10)})
print(sorted({c.lower() for c in 'AbcABC'}))
print(len({x // 2 for x in range(10)})){0, 1, 2}
['a', 'b', 'c']
5元组推导式(生成器表达式)
Python 没有「元组推导式」—— 圆括号的写法其实是生成器表达式,惰性求值、只能遍历一次,但内存占用是常数级。需要元组时套一层 tuple()。
g = (x ** 2 for x in range(5))
print(type(g).__name__)
print(sum(g))
print(sum(g))
print(tuple(x for x in range(3)))
print(max(x for x in range(5)))generator
30
0
(0, 1, 2)
4sum(g) 得到 0,因为迭代器已经耗尽。需要重复使用就存成列表。