Python3 推导式
Python 推导式(Comprehensions)
🎯 学习目标
掌握 Python 中的列表推导式、字典推导式、集合推导式和生成器表达式,理解其在数据处理中的高效性与简洁性。能够在实际项目中灵活使用推导式替代传统循环结构,提升代码可读性和执行效率。
🔑 核心重点
| 分类 | 内容 |
|---|---|
| 类型全面 | 支持列表、字典、集合、生成器四种推导式 |
| 语法简洁 | 一行代码完成复杂的数据转换或筛选操作 |
| 实际应用场景 | 数据清洗、格式转换、过滤筛选、批量构造等 |
| 性能优势 | 比传统 for 循环更快,适合大数据量处理 |
📚 详细讲解
一、什么是推导式?
推导式(Comprehensions)是 Python 提供的一种简洁高效的构建数据结构的方式,可以看作是“一行 for 循环”的语法糖。
✅ 基本结构:
[expression for item in iterable if condition]
expression:对每个元素进行的操作item:迭代变量iterable:可迭代对象if condition:可选条件筛选
二、列表推导式(List Comprehension)
用于快速创建列表。
✅ 示例1:基本用法
squares = [x**2 for x in range(6)]
print(squares) # [0, 1, 4, 9, 16, 25]
✅ 示例2:带条件筛选
evens = [x for x in range(10) if x % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]
✅ 示例3:嵌套推导式(二维列表展开)
matrix = [[1, 2], [3, 4], [5, 6]]
flattened = [num for row in matrix for num in row]
print(flattened) # [1, 2, 3, 4, 5, 6]
三、字典推导式(Dictionary Comprehension)
用于快速创建字典。
✅ 示例1:从列表构造字典
names = ["Alice", "Bob", "Charlie"]
name_lengths = {name: len(name) for name in names}
print(name_lengths)
# {'Alice': 5, 'Bob': 3, 'Charlie': 7}
✅ 示例2:筛选并构造字典
scores = {"Alice": 90, "Bob": 85, "Charlie": 95}
high_scores = {k: v for k, v in scores.items() if v >= 90}
print(high_scores) # {'Alice': 90, 'Charlie': 95}
四、集合推导式(Set Comprehension)
用于快速创建集合(自动去重)。
✅ 示例:
words = ["apple", "banana", "apple", "cherry"]
unique_words = {word for word in words}
print(unique_words) # {'banana', 'cherry', 'apple'}
五、生成器表达式(Generator Expression)
与列表推导式类似,但不立即生成列表,而是返回一个生成器对象,适用于内存敏感的大数据处理。
✅ 示例:
gen = (x**2 for x in range(10))
for num in gen:
print(num)
📌 区别于列表推导式:
- 列表推导式:
[] - 生成器表达式:
()
六、推导式的嵌套与多重条件
✅ 示例:多层嵌套推导式(合并多个条件)
result = [(x, y) for x in range(3) for y in range(2)]
print(result)
# [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]
✅ 示例:带双重条件
nums = [x for x in range(20) if x % 2 == 0 if x > 5]
print(nums) # [6, 8, 10, 12, 14, 16, 18]
⚠️ 注意事项
- 推导式虽简洁,但不宜过于复杂,避免影响可读性
- 不建议嵌套超过两层的推导式
- 使用生成器表达式时注意它只能遍历一次
- 对于大数据集,优先考虑生成器以节省内存
- 推导式中的变量不会污染外部命名空间(Python 3)
🧪 实际案例分析
📌 场景:日志文件清洗与统计
假设你有一个日志文件 access.log,每行记录如下:
GET /index.html 200
GET /about.html 404
POST /login 200
...
我们想提取所有状态码为 200 的请求路径。
with open('access.log') as f:
successful_paths = [
line.split()[1] for line in f if line.strip().endswith("200")
]
print(successful_paths)
📌 应用:
- 日志分析
- 批量数据清洗
- 构建索引结构
- 快速数据转换
🧩 拓展练习(动手实践)
- 编写程序,将一个整数列表中所有偶数平方后存入新列表。
- 输入一个字符串列表,使用字典推导式输出长度大于3的单词及其长度。
- 使用集合推导式去除列表中重复元素,并保持顺序不变(提示:结合
dict.fromkeys())。 - 编写函数
filter_even_squares(n),返回小于 n 的所有偶数平方值(使用生成器表达式)。 - 给定两个列表
keys = ['a', 'b', 'c']和values = [1, 2, 3],使用字典推导式合并它们。
📚 推荐阅读
- Python 官方文档 - 表达式
- 《流畅的 Python》第 1 章 - 推导式与生成器基础
- 廖雪峰 Python 教程 - 列表生成式
- 菜鸟教程 - Python 推导式
- Real Python - Python List Comprehensions
🧭 下一步建议
- 下一章学习内容:《Python 函数详解(上)》
- 掌握函数定义、参数传递方式(位置参数、关键字参数、默认参数、可变参数)
- 学习函数返回值、作用域、lambda 表达式等基础知识
- 探索函数模块化编程思想与高阶函数概念
- 结合推导式与函数知识,尝试编写结构清晰、功能完整的 Python 程序
如果你希望我为你提供:
- Python 推导式速查表 PDF(含示例)
- 更多实战项目练习题(如日志分析器、数据转换器、批量处理器等)
- 推导式高级技巧详解(如性能优化、链式推导、与 map/filter 配合使用)
- 视频教学资源推荐(中文讲解)
欢迎随时告诉我 😊

浙公网安备 33010602011771号