推导式是 Python 中一种非常简洁、优雅的语法,用于快速创建列表、字典、集合等数据结构。
什么是推导式?
推导式(Comprehension)是 Python 独有的特性,它允许你用简洁的语法基于已有的可迭代对象(如列表、元组、集合等)来创建新的数据结构。
四种主要的推导式
1. 列表推导式 (List Comprehension)
语法: [expression for item in iterable if condition]
示例:
# 创建 0-9 的平方列表
squares = [x**2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 带条件的列表推导式
even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares) # [0, 4, 16, 36, 64]
# 使用多个循环
pairs = [(x, y) for x in range(3) for y in range(3)]
print(pairs) # [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2), (2,0), (2,1), (2,2)]
2. 字典推导式 (Dictionary Comprehension)
语法: {key_expression: value_expression for item in iterable if condition}
示例:
# 创建数字到其平方的映射
squares_dict = {x: x**2 for x in range(5)}
print(squares_dict) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 交换键值对
original = {'a': 1, 'b': 2, 'c': 3}
reversed_dict = {v: k for k, v in original.items()}
print(reversed_dict) # {1: 'a', 2: 'b', 3: 'c'}
# 带条件的字典推导式
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
print(even_squares) # {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
3. 集合推导式 (Set Comprehension)
语法: {expression for item in iterable if condition}
示例:
# 创建不重复的平方数集合
squares_set = {x**2 for x in range(-5, 6)}
print(squares_set) # {0, 1, 4, 9, 16, 25}
# 从列表中去除重复项并转换
words = ['hello', 'world', 'hello', 'python']
unique_lengths = {len(word) for word in words}
print(unique_lengths) # {5, 6}
4. 生成器表达式 (Generator Expression)
语法: (expression for item in iterable if condition)
示例:
# 创建生成器(惰性求值,节省内存)
squares_gen = (x**2 for x in range(1000000))
# 使用生成器
for i, square in enumerate(squares_gen):
if i >= 5:
break
print(square) # 0, 1, 4, 9, 16
# 生成器表达式作为函数参数
total = sum(x**2 for x in range(10))
print(total) # 285
嵌套推导式
推导式可以嵌套使用,但要注意可读性:
# 创建二维矩阵
matrix = [[i * j for j in range(3)] for i in range(3)]
print(matrix) # [[0, 0, 0], [0, 1, 2], [0, 2, 4]]
# 扁平化二维列表
flat = [num for row in matrix for num in row]
print(flat) # [0, 0, 0, 0, 1, 2, 0, 2, 4]
推导式 vs 传统循环
传统方式:
squares = []
for x in range(10):
if x % 2 == 0:
squares.append(x**2)
推导式方式:
squares = [x**2 for x in range(10) if x % 2 == 0]
使用建议
- 优点:
- 代码更简洁
- 通常比传统循环更快
- 可读性更强(对于简单情况)
- 注意事项:
- 避免过度复杂的推导式,否则会降低可读性
- 对于复杂的逻辑,使用传统循环可能更清晰
- 生成器表达式适合处理大数据集,节省内存
总结
推导式类型 | 语法 | 返回类型 |
列表推导式 |
| list |
字典推导式 |
| dict |
集合推导式 |
| set |
生成器表达式 |
| generator |
掌握推导式可以让你的 Python 代码更加 Pythonic(符合 Python 风格)和高效!