推导式(Comprehension)是Python中一种简洁而强大的语法结构,用于创建列表、字典、集合等数据结构。它允许我们用一行代码来生成这些数据结构,比传统的循环方式更加简洁和易读。
目录
推导式的优势:
- 简洁性:相比传统循环,代码更短
- 可读性:对于简单操作,更容易理解意图
- 性能:通常比传统循环更快
- 功能性:可以在一行中完成过滤、转换等操作
一、推导式
1. 列表推导式
- 基本格式:
[表达式 for 变量 in 列表]- 带条件:
[表达式 for 变量 in 列表 if 条件]- 多重循环:
[表达式 for 变量1 in 列表1 for 变量2 in 列表2]
(1).基本格式:
# 生成1-5的平方列表
squares = [x**2 for x in range(1, 6)]
print(squares) #输出:[1, 4, 9, 16, 25]
# 传统写法:使用for循环生成1-5的平方列表
squares = []
for x in range(1, 6):
squares.append(x**2)
print(squares) # 输出:[1, 4, 9, 16, 25]
所以推导式与传统写法对比,把代码浓缩到了一行,简洁不少。
(2).带条件:找出1-10的偶数:
evens = [x for x in range(1, 11) if x % 2 == 0]
print(evens) #输出:[2, 4, 6, 8, 10]
(3).多重循环:两个列表的组合:
colors = ["红", "绿"]
fruits = ["苹果", "香蕉"]
combination = [c + f for c in colors for f in fruits]
print(combination)
#输出:
# ['红苹果', '红香蕉', '绿苹果', '绿香蕉']
关键点:多重循环等价于嵌套for循环,先循环外层再循环内层
2. 集合推导式
- 格式:
{表达式 for 变量 in 列表}(用花括号)
# 列表去重并转成集合
numbers = [1, 2, 2, 3, 3, 3, 4]
unique_set = {x for x in numbers}
print(unique_set)
# 找出1-10中的奇数集合
odd_set = {x for x in range(1, 11) if x % 2 != 0}
print(odd_set)

关键点:集合推导式自动去重,结果是一个集合
3. 字典推导式
- 格式:
{键:值 for 变量 in 列表}- 配合zip()打包两个列表
# 把两个列表组合成字典
keys = ["name", "age", "city"]
values = ["小明", 18, "北京"]
info = {k: v for k, v in zip(keys, values)}
print(info)
# 快速创建数字平方字典
squares_dict = {x: x**2 for x in range(1, 6)}
print(squares_dict)

关键点:zip()函数把两个列表像拉链一样合并在一起
4. 生成器推导式
基本语法:(expression for item in iterable) (表达式 for 变量 in 可迭代对象)
生成器推导式(Generator Expression)圆括号包裹,与列表推导式(方括号)类似,,但返回的是一个生成器对象而不是列表:
squares_gen = (x**2 for x in range(1, 6))
print(squares_gen) # <generator object <genexpr> at ...>
print(list(squares_gen)) # [1, 4, 9, 16, 25]
# 生成器是一次性的,用完即弃
print(list(squares_gen)) # [] - 再次调用得到空列表
二、复杂示例
# 嵌套推导式
matrix = [[i*j for j in range(1, 4)] for i in range(1, 4)]
print(matrix) # [[1, 2, 3], [2, 4, 6], [3, 6, 9]]
# 使用多个for子句
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)]
# 结合条件判断
filtered_pairs = [(x, y) for x in range(5) for y in range(5) if x < y]
print(filtered_pairs) # [(0, 1), (0, 2), (0, 3), (0, 4), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
第一个嵌套式推导式分析:
1.这是嵌套的推导式,我们遇到的一个for循环是外层推导式,即for i in range(1, 4)
i 的取值依次为 1, 2, 3
2.对于每个 i 值,内层推导式:[i*j for j in range(1, 4)]
当 i=1 时:j 取 1,2,3,结果为 [11, 12, 1*3] = [1, 2, 3]
当 i=2 时:j 取 1,2,3,结果为 [21, 22, 2*3] = [2, 4, 6]
当 i=3 时:j 取 1,2,3,结果为 [31, 32, 3*3] = [3, 6, 9]
第二个for循环子句代码解释:
推导式的执行顺序,按照从左到右的顺序:
第一个 for x in range(3) 是外层循环,x 依次取值 0, 1, 2
第二个 for y in range(3) 是内层循环,- 对每个x值,y 依次取值 0, 1, 2
等价的传统嵌套循环:
pairs = []
for x in range(3): # 外层循环
for y in range(3): # 内层循环
pairs.append((x, y))
三、表格总结:推导式速查
| 类型 | 语法格式 | 示例 | 输出 | 适用场景 |
| 列表 |
|
|
| 生成新列表 |
| 带条件 |
|
| 过滤数据 | |
| 多重循环 |
|
| 组合数据 | |
| 集合 |
|
|
| 去重+集合 |
| 字典 |
|
|
| 键值对生成 |
推导式记住[结果 for 变量 in 列表 if 条件]
四、实战小案例(练手)
# 案例1:用推导式清洗数据
prices = [" 10元 ", "20元", " 30元 "]
clean_prices = [p.strip().replace("元", "") for p in prices]
print(f"清洗后:{clean_prices}")
# 案例2:找出1-100中能被7整除的数
result = [x for x in range(1, 101) if x % 7 == 0]
print(f"结果:{result}")

案例1代码详解:
for p in prices - 遍历列表中的每个元素
p 是列表中的每个字符串元素(如 " 10元 ")
p.strip() - 对每个字符串调用 strip() 方法,移除首尾空白字符
p.strip().replace("元", "") - 在去除空白后,再调用 replace() 方法替换掉"元"字
strip()和replace()是字符串的操作方法(需要了解更多字符串的欢迎查看7.2 Python3序列 | 字符串操作:常用方法与格式化技巧-CSDN博客)
1965

被折叠的 条评论
为什么被折叠?



