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)

📌 应用

  • 日志分析
  • 批量数据清洗
  • 构建索引结构
  • 快速数据转换

🧩 拓展练习(动手实践)

  1. 编写程序,将一个整数列表中所有偶数平方后存入新列表。
  2. 输入一个字符串列表,使用字典推导式输出长度大于3的单词及其长度。
  3. 使用集合推导式去除列表中重复元素,并保持顺序不变(提示:结合 dict.fromkeys())。
  4. 编写函数 filter_even_squares(n),返回小于 n 的所有偶数平方值(使用生成器表达式)。
  5. 给定两个列表 keys = ['a', 'b', 'c']values = [1, 2, 3],使用字典推导式合并它们。

📚 推荐阅读


🧭 下一步建议

  • 下一章学习内容:《Python 函数详解(上)》
  • 掌握函数定义、参数传递方式(位置参数、关键字参数、默认参数、可变参数)
  • 学习函数返回值、作用域、lambda 表达式等基础知识
  • 探索函数模块化编程思想与高阶函数概念
  • 结合推导式与函数知识,尝试编写结构清晰、功能完整的 Python 程序

如果你希望我为你提供:

  • Python 推导式速查表 PDF(含示例)
  • 更多实战项目练习题(如日志分析器、数据转换器、批量处理器等)
  • 推导式高级技巧详解(如性能优化、链式推导、与 map/filter 配合使用)
  • 视频教学资源推荐(中文讲解)

欢迎随时告诉我 😊

posted @ 2025-05-28 21:37  红尘过客2022  阅读(39)  评论(0)    收藏  举报