用5分钟彻底掌握Python推导式(新手友好指南)
Python推导式(Comprehension)是Python最具特色的语法糖之一,也是Pythonic编程的典型代表。本文将通过10个精选示例,带你从入门到精通这个高效的数据结构构建工具。
一、什么是推导式?
推导式是一种通过简洁的语法快速构建数据结构的表达式。它比传统的循环写法更简洁,执行效率也更高。主要类型包括:
- 列表推导式(List Comprehension)
- 字典推导式(Dictionary Comprehension)
- 集合推导式(Set Comprehension)
- 生成器推导式(Generator Expression)
二、列表推导式(最常用)
基本结构:
[expression for item in iterable]
示例1:平方数生成
# 传统写法
squares = []
for x in range(10):
squares.append(x**2)
# 推导式写法
squares = [x**2 for x in range(10)]
示例2:带条件过滤
# 生成0-9中偶数的平方
even_squares = [x**2 for x in range(10) if x % 2 == 0]
# 结果:[0, 4, 16, 36, 64]
示例3:多层嵌套(相当于嵌套循环)
matrix = [[1,2], [3,4], [5,6]]
flattened = [num for row in matrix for num in row]
# 结果:[1, 2, 3, 4, 5, 6]
三、字典推导式
基本结构:
{key_expr: value_expr for item in iterable}
示例4:键值转换
fruit_prices = {'apple': 5, 'banana': 3, 'orange': 4}
price_fruits = {v: k for k, v in fruit_prices.items()}
# 结果:{5: 'apple', 3: 'banana', 4: 'orange'}
示例5:条件过滤
scores = {'Alice': 85, 'Bob': 62, 'Charlie': 91}
passed = {k: v for k, v in scores.items() if v >= 70}
# 结果:{'Alice': 85, 'Charlie': 91}
四、集合推导式
基本结构:
{expression for item in iterable}
示例6:去重处理
words = ['hello', 'world', 'hello', 'python']
unique_lengths = {len(word) for word in words}
# 结果:{5, 6} (因为hello长度5,world/python长度5/6)
五、生成器推导式
基本结构:
(expression for item in iterable)
示例7:内存优化
gen = (x**2 for x in range(1000000)) # 不立即生成所有元素
print(next(gen)) # 0
print(next(gen)) # 1
六、推导式的优势对比
| 方法 | 代码量 | 执行速度 | 内存占用 | 可读性 |
|---|---|---|---|---|
| 传统循环 | 多 | 慢 | 正常 | 高 |
| 推导式 | 少 | 快 | 正常 | 中高 |
| 生成器 | 少 | 最快 | 极低 | 中 |
七、使用注意事项
- 可读性优先:当表达式过于复杂时,建议改用传统循环
- 避免副作用:不要在推导式中修改外部变量
- 数据量过大:考虑使用生成器推导式节省内存
- 嵌套层级:建议不超过2层嵌套
错误示范:
# 过度复杂的推导式
result = [[x*y for y in range(10) if y%2] for x in range(5) if x>2]
优化建议:
# 拆分为多个步骤
filtered_x = [x for x in range(5) if x > 2]
result = []
for x in filtered_x:
filtered_y = [y for y in range(10) if y%2]
result.append([x*y for y in filtered_y])
八、实际应用场景
- 数据清洗:
clean_data = [x.strip() for x in raw_data if x] - 类型转换:
int_list = [int(x) for x in str_list] - 矩阵运算:
transpose = [[row[i] for row in matrix] for i in range(3)] - 快速统计:
word_counts = {word: text.count(word) for word in set(text.split())}
九、总结
Python推导式是提升代码简洁性和执行效率的利器,但需要合理使用:
✅ 适合场景:
- 简单的数据转换
- 集合过滤操作
- 需要优化性能的关键代码
- 内存敏感的大数据处理(生成器)
❌ 避免场景:
- 需要多重条件判断的复杂逻辑
- 包含异常处理的流程
- 需要多次复用中间结果的场景
- 需要明确循环变量的情况
记住:代码的可维护性永远比简洁性更重要。当推导式超过3层嵌套或行宽超过80字符时,就应该考虑改用传统循环写法了。