Python 推导式(Comprehensions)是一种简洁高效的语法糖,用于从一个或多个可迭代对象(如列表、字典、集合)创建新的数据结构。它能将循环和条件判断的逻辑合并为一行代码,显著提升代码可读性和编程效率。以下从多个维度详细解析 Python 推导式的核心用法、进阶技巧及注意事项:
[表达式 for 变量 in 可迭代对象]
[表达式 for 变量 in 可迭代对象 if 条件判断]
-
生成平方数列表
squares = [x**2 for x in range(10)]
-
过滤偶数
evens = [x for x in range(10) if x % 2 == 0]
-
嵌套循环
pairs = [(x, y) for x in [1, 2] for y in [3, 4]]
{键表达式: 值表达式 for 变量 in 可迭代对象}
{键表达式: 值表达式 for 变量 in 可迭代对象 if 条件判断}
-
交换字典的键值对
original = {'a': 1, 'b': 2}
reversed_dict = {v: k for k, v in original.items()}
-
过滤值大于 10 的项
data = {'apple': 5, 'banana': 15, 'cherry': 20}
filtered = {k: v for k, v in data.items() if v > 10}
{表达式 for 变量 in 可迭代对象}
{表达式 for 变量 in 可迭代对象 if 条件判断}
-
生成唯一的平方数集合
squares_set = {x**2 for x in [-1, 1, 2]}
-
从字符串中提取唯一字符
unique_chars = {c for c in "hello" if c != 'l'}
(表达式 for 变量 in 可迭代对象)
(表达式 for 变量 in 可迭代对象 if 条件判断)
-
惰性生成平方数
gen = (x**2 for x in range(3))
next(gen)
-
计算总和(无需创建完整列表)
total = sum(x**2 for x in range(1000))
matrix = [[i*j for j in range(3)] for i in range(2)]
nested_dict = {i: {j: i*j for j in range(2)} for i in range(2)}
values = [-1, 2, -3]
abs_values = [x if x >= 0 else -x for x in values]
grades = [85, 95, 70]
results = ['A' if x >= 90 else 'B' if x >= 80 else 'C' for x in grades]
-
生成器表达式的优势
- 列表推导式会立即创建完整列表,占用大量内存。
- 生成器表达式惰性生成值,适合处理大数据:
-
时间复杂度
- 推导式通常比显式循环快,因为其内部优化为 C 语言实现:
-
变量泄漏问题
- Python 2 中,推导式会泄漏变量到外部作用域,Python 3 已修复:
-
过度复杂的推导式
- 避免嵌套过深或逻辑过于复杂的推导式,保持代码可读性:
推导式 vs map/filter:
Python 推导式通过简洁的语法实现复杂的数据转换和过滤,显著提升代码可读性和执行效率。其核心分类包括:
- 列表推导式:
[expression for item in iterable]
- 字典推导式:
{key: value for item in iterable}
- 集合推导式:
{expression for item in iterable}
- 生成器表达式:
(expression for item in iterable)
使用时需注意变量作用域、内存优化和代码可读性,避免过度复杂的嵌套结构。推导式与生成器表达式结合可高效处理大数据场景,是 Python 编程中不可或缺的强大工具。