Python推导式学习
列表推导式
[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] ]
可以这样认为,它只是对 for 循环语句的格式做了一下简单的变形,并用 []
括起来而已,只不过最大的不同之处在于,列表推导式最终会将循环过程中,计算表达式得到的一系列值组成一个列表。
a_range = range(10)
# 对a_range执行for表达式
a_list = [x * x for x in a_range]
# a_list集合包含10个元素
print(a_list)
输出结果:
[0 , 1 , 4 , 9 , 16 , 25 , 36 , 49 , 64, 81]
不仅如此,我们还可以在列表推导式中添加 if 条件
语句,这样列表推导式将只迭代那些符合条件的元素。例如:
b_list = [x * x for x in a_range if x % 2 == 0]
# a_list集合包含5个元素
print(b_list)
输出结果:
[0 ,4 , 16, 36, 64]
当然,也支持类似于多层嵌套的 for 表达式,例如如下代码:
e_list = [[x, y, z] for x in range(5) for y in range(4) for z in range(6)]
# e_list列表包含120个元素
print(e_list)
对于包含多个循环的 for 表达式,同样可指定 if 条件。
src_a = [30, 12, 66, 34, 39, 78, 36, 57, 121]
src_b = [3, 5, 7, 11]
# 只要x能整除y,就将它们配对在一起
result = [(x, y) for x in src_a for y in src_b if x % y == 0]
print(result)
输出结果:
[(30, 3), (30, 5), (12, 3), (66, 3), (66, 11), (39, 3), (78, 3), (36, 3), (57, 3), (121, 11)]
元组推导式
除了元组推导式是用 () 圆括号
将各部分括起来,而列表推导式用的是 []
,其它完全相同。不仅如此,元组推导式和列表推导式的用法也完全相同。
用元组推导式生成的结果并不是一个元组,而是一个生成器对象,这一点和列表推导式是不同的
如果我们想要使用元组推导式获得新元组或新元组中的元素,有以下三种方式:
- 使用 tuple() 函数,可以直接将生成器对象转换成元组,例如:
a = (x for x in range(1,10))
print(tuple(a))
运行结果为:
(1, 2, 3, 4, 5, 6, 7, 8, 9)
- 直接使用 for 循环遍历生成器对象,可以获得各个元素,例如:
a = (x for x in range(1,10))
for i in a:
print(i,end=' ')
print(tuple(a))
输出结果:
1 2 3 4 5 6 7 8 9 ()
- 使用
__next__()
方法遍历生成器对象,也可以获得各个元素,例如:
a = (x for x in range(3))
print(a.__next__())
print(a.__next__())
print(a.__next__())
a = tuple(a)
print("转换后的元组:",a)
输出结果:
0
1
2
转换后的元组: ()
无论是使用 for 循环
遍历生成器对象,还是使用 __next__()
方法遍历生成器对象,遍历后原生成器对象将不复存在,这就是遍历后转换原生成器对象却得到空元组的原因。
字典推导式
语法形式
{表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]}
可以看到,和其它推导式的语法格式相比,唯一不同在于,字典推导式用的是大括号{}
。
使用 if 表达式筛选符合条件的键值对。
olddict={'Jack': 4, 'Tom': 3}
newdict = {v: k for k, v in olddict.items() if v>3}
print(newdict)
输出结果:
{4: 'Jack'}
集合推导式
集合推导式的语法格式和字典推导式完全相同,如下所示:
{ 表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] }
既然生成的是集合,那么其保存的元素必须是唯一的。
tupledemo = (1,1,2,3,4,5,6,6)
setnew = {x**2 for x in tupledemo if x%2==0}
print(setnew)
输出结果:
{16, 4, 36}