Python中推导式和表达式
在 Python 中,推导式(Comprehensions) 和 生成器表达式(Generator Expressions) 是简洁高效的数据结构构造方式,适用于 列表(List)、元组(Tuple)、字典(Dictionary)、集合(Set) 和 生成器(Generator)。
1. 列表推导式(List Comprehension)
作用:快速生成列表,比 for
循环更简洁高效。
语法:[expression for item in iterable if condition]
示例
(1) 基本形式
squares = [x ** 2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
(2) 带条件过滤
even_squares = [x ** 2 for x in range(10) if x % 2 == 0]
print(even_squares) # [0, 4, 16, 36, 64]
(3) 嵌套循环
pairs = [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y]
print(pairs) # [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
2. 元组推导式(Tuple Comprehension)
注意:Python 没有真正的 "元组推导式",但可以用 tuple()
包裹生成器表达式。
语法:tuple(expression for item in iterable if condition)
示例
even_numbers = tuple(x for x in range(10) if x % 2 == 0)
print(even_numbers) # (0, 2, 4, 6, 8)
3. 字典推导式(Dictionary Comprehension)
作用:快速生成字典。
语法:{key_expr: value_expr for item in iterable if condition}
示例
(1) 基本形式
square_dict = {x: x ** 2 for x in range(5)}
print(square_dict) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
(2) 交换键值
original = {'a': 1, 'b': 2, 'c': 3}
swapped = {v: k for k, v in original.items()}
print(swapped) # {1: 'a', 2: 'b', 3: 'c'}
(3) 条件过滤
filtered_dict = {k: v for k, v in original.items() if v > 1}
print(filtered_dict) # {'b': 2, 'c': 3}
4. 集合推导式(Set Comprehension)
作用:生成不重复的无序集合。
语法:{expression for item in iterable if condition}
示例
unique_squares = {x ** 2 for x in [-2, -1, 0, 1, 2]}
print(unique_squares) # {0, 1, 4}
5. 生成器表达式(Generator Expression)
作用:惰性计算(按需生成值),节省内存。
语法:(expression for item in iterable if condition)
示例
(1) 基本形式
gen = (x ** 2 for x in range(10))
print(gen) # <generator object <genexpr> at 0x7f8c0a2b3d60># 逐个取值
for num in gen:print(num, end=" ") # 0 1 4 9 16 25 36 49 64 81
(2) 与 sum()
、max()
等函数结合
sum_of_squares = sum(x ** 2 for x in range(10))
print(sum_of_squares) # 285
总结对比
数据结构 | 推导式语法 | 特点 |
---|---|---|
列表 | [x for x in iterable] | 可变,有序 |
元组 | tuple(x for x in iterable) | 不可变,有序 |
字典 | {k: v for k, v in iterable} | 键值对,无序 |
集合 | {x for x in iterable} | 唯一值,无序 |
生成器 | (x for x in iterable) | 惰性计算,节省内存 |
应用场景
列表推导式:适合构造新列表,如
[x * 2 for x in lst]
字典推导式:适合转换字典,如
{k: v * 2 for k, v in d.items()}
集合推导式:适合去重,如
{x % 5 for x in nums}
生成器表达式:适合大数据处理(避免内存爆炸),如
sum(x ** 2 for x in range(10**6))
性能优化
生成器 > 列表推导式(内存更优)
map()
+filter()
比推导式更快(但可读性较差)
# 生成器(内存高效)
gen = (x ** 2 for x in range(10**6) if x % 2 == 0)# 列表推导式(立即计算)
lst = [x ** 2 for x in range(10**6) if x % 2 == 0]
掌握推导式可以大幅提升 Python 代码的简洁性和效率!