跳转至

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 代码的重要标志,合理使用可以让代码更加清晰可读。但如果逻辑过于复杂(如多层嵌套循环),建议还是使用传统的循环结构,以保持代码的可读性。

下一步

学习完推导式后,生成器表达式的概念自然引出了生成器迭代器的更深入话题。

👉 前往下一章:迭代器与生成器