Python 推导式与生成器表达式
推导式(Comprehensions)是 Python 中一种独特且高效的数据处理方式,可以用简洁的语法从一个序列构建另一个新的序列。它不仅代码更精简,通常比普通的 for 循环执行效率更高。
1. 列表推导式 (List Comprehension)
列表推导式提供了一种简洁的方法来创建列表。
基本语法
[expression for item in iterable if condition]
示例
传统写法:
squares = []
for x in range(10):
squares.append(x**2)
print(squares)
# 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
推导式写法:
squares = [x**2 for x in range(10)]
print(squares)
带条件的列表推导式
# 获取偶数的平方
evens = [x**2 for x in range(10) if x % 2 == 0]
print(evens)
# 输出: [0, 4, 16, 36, 64]
双重循环
# 生成坐标点 (0,0), (0,1), (1,0), (1,1)
points = [(x, y) for x in range(2) for y in range(2)]
print(points)
2. 字典推导式 (Dictionary Comprehension)
字典推导式用于快速创建字典。
基本语法
{key_expression: value_expression for item in iterable if condition}
示例
# 将列表元素作为键,平方作为值
numbers = [1, 2, 3, 4, 5]
square_dict = {x: x**2 for x in numbers}
print(square_dict)
# 输出: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
# 交换字典的键值对
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. 集合推导式 (Set Comprehension)
集合推导式与列表推导式类似,只不过使用花括号 {},并且结果是一个去重的集合。
基本语法
{expression for item in iterable if condition}
示例
numbers = [1, 2, 2, 3, 4, 4, 5]
unique_squares = {x**2 for x in numbers}
print(unique_squares)
# 输出: {1, 4, 9, 16, 25} (顺序可能不同)
4. 生成器表达式 (Generator Expression)
生成器表达式与列表推导式语法非常相似,但它是用圆括号 () 包裹。它不会一次性生成所有数据,而是返回一个生成器对象,按需生成数据,非常适合处理大数据集以节省内存。
基本语法
(expression for item in iterable if condition)
示例
# 创建生成器
gen = (x**2 for x in range(10))
print(gen)
# 输出: <generator object <genexpr> at ...>
# 逐个获取值
print(next(gen)) # 0
print(next(gen)) # 1
# 或者在循环中使用
for val in gen:
print(val, end=' ')
# 输出剩余的值: 4 9 16 25 36 49 64 81
内存对比
import sys
# 列表推导式:一次性占用所有内存
list_comp = [x for x in range(1000000)]
print(f"List size: {sys.getsizeof(list_comp)} bytes")
# 生成器表达式:几乎不占用额外内存
gen_expr = (x for x in range(1000000))
print(f"Generator size: {sys.getsizeof(gen_expr)} bytes")
总结
| 类型 | 语法 | 返回类型 |
|---|---|---|
| 列表推导式 | [exp for i in seq] |
list |
| 字典推导式 | {k:v for i in seq} |
dict |
| 集合推导式 | {exp for i in seq} |
set |
| 生成器表达式 | (exp for i in seq) |
generator |
推导式是 Pythonic 代码的重要标志,合理使用可以让代码更加清晰可读。但如果逻辑过于复杂(如多层嵌套循环),建议还是使用传统的循环结构,以保持代码的可读性。
下一步
学习完推导式后,生成器表达式的概念自然引出了生成器和迭代器的更深入话题。