推导式
约 1309 字大约 4 分钟
2025-04-22
阅读导览
推导式
==推导式==(有时也称==表达式==)用来创建一些有规律的==可变数据结构==(主要是列表、字典和集合),能够让代码变得更加简洁
- 列表推导式
- 字典推导式和集合推导式
- 生成器表达式(推导式)
实践清单
学习练习清单
- 1先把 [i*i for i in range(10)] 翻译回普通 for 循环,再倒过来翻一次,建立两种写法的对应关系。
- 2把一段三层 for 循环改成嵌套推导式,再读一遍 —— 如果读不顺,说明该用 for 循环。
- 3练 {k: v for k, v in items} 把元组列表转字典,比较和 dict(items) 的差别。
- 4对大数据集分别用 sum([x*x for x in range(10**6)]) 和 sum(x*x for x in range(10**6)),体会生成器表达式的内存优势。
推导式(有时也称表达式)用来创建一些有规律的可变数据结构(主要是列表、字典和集合),能够让代码变得更加简洁
列表推导式
用我们学到的知识,如果我们想要创建一个数字从 1 到 50 的列表,可以通过循环的方法这样做:
python playground
lst = []
for i in range(1, 51):
lst.append(i)
print(lst)如果使用列表推导式,我们只需要一行代码:
python playground
print([i for i in range(1, 51)])我们就成功创建了一个列表推导式(或称列表表达式)。我们还可以运用字符串的格式化实现更多样化的输出:
python playground
print([f'Python3.{i}' for i in range(1, 51)])前面两种是列表推导式的普通循环模式,它的基本结构为:
[加工后的变量 for循环]除了普通循环模式,我们还可以通过给循环增加筛选条件,实现筛选模式的列表推导式:
python playground
print([i for i in range(1, 51) if i > 25])筛选模式的列表推导式的基本结构为:
[加工后的变量 for循环 加工条件]列表推导式还支持嵌套。对于这样一个嵌套的循环:
python playground
lst = []
for i in range(2):
for j in range(2):
lst.append(i + j)
print(lst)改成列表推导式结构就成了这样:
python playground
print([i + j for i in range(2) for j in range(2)])嵌套的列表推导式同样可以使用条件进行筛选:
python playground
print([(i, j) for i in range(5) if i > 3 for j in range(6) if j < 3])虽然列表推导式能节省很多代码,但是最多建议嵌套三层。
生成器可以让代码更加简化。比如,我们想用循环的方式求字符串 'alice,alan' 中每个字母 a 的索引。如果用 for 循环来写是可以实现的,但是需要多行代码:
python playground
s = 'alice,alan'
count = 0
lst = []
for i in s:
if i == 'a':
lst.append(count)
count += 1
print(lst) # [0, 6, 8]而如果使用列表生成器的话,只需要一行代码即可实现:
python playground
print([i for i in range(len(s)) if s[i] == 'e'])字典推导式和集合推导式
除了列表之外,其他可变数据类型,比如字典字典和集合也可以通过推导式的方法来创建:
python playground
# 字典推导式
# 字典推导式普通循环模式 {变量: 变量 for循环}
print({i: i+1 for i in range(3)})
print({f'Python3.{i}': i + 1 for i in range(3)})
# 字典推导式筛选模式 {加工后的变量: 加工的后的变量 for循环 加工条件}
print({i:i+1 for i in range(3) if i > 1})
# 集合推导式
# 集合推导式普通循环模式:{变量 for循环}
print({i for i in range(3)})
# 集合推导式筛选模式:{加工后的变量 for循环 加工条件}
print({i for i in range(3) if i > 2})生成器表达式(推导式)
我们即将会提到的 生成器,除了可以通过函数的方式实现,还可以使用表达式来实现。与列表表达式相似,生成器表达式也有普通模式和筛选模式:
# 普通模式:
g = (i for i in range(3))
# 筛选模式:
g = (i for i in range(3) if i + 1 == 2)生成器推导式的好处有三个:简化代码,提高逼格和提高可读性。
同列表表达式一样,生成器推导式用于生成一些有规律的数据。当我们需要生成的数据较大时,建议使用生成器推导式
重点总结
要点回收
- 推导式只是 for 循环的浓缩,结构是 [表达式 for 循环 if 条件],建议最多嵌套两层。
- 字典和集合推导式用 {} 包裹,字典靠冒号区分键值。
- 数据量大或只迭代一次的场景,把方括号换成圆括号 —— 这就是生成器表达式,几乎不占内存。
- 需要带状态的累加或复杂分支时,老老实实写 for 循环,可读性比炫技重要。
版权所有
版权归属:Shuo Liu
