测开之数据类型进阶篇・第三篇《推导式》

Posted 七月的小尾巴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了测开之数据类型进阶篇・第三篇《推导式》相关的知识,希望对你有一定的参考价值。

列表推导式

什么是推导式?

列表推导式可以利用 range 区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的列表。

列表推导式的语法格式如下:

[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] ]

推导式代码实现

首先我们先用一分钟想一下,怎么去在列表中新增1-100的数据呢?下面我们来看一下代码的实现

list1 = []

for i in range(1, 101):
    list1.append(i)

print(list1)

下面我们使用列表推导式实现列表中新增1-100的数据

list2 = [i for i in range(1, 100)]

其中 for i in range(1, 100) 每一次循环,都会往 i 中加入数据,列表推导式会遍历后面的可迭代对象,然后按照for前的表达式进行运算,生成最终的列表。

很多人会说代码简洁了但可读性降低了,其实不然,当我们对列表推导式熟悉(自己写几次就熟悉了),代码的功能一眼就能轻松地看出来,但是for循环代码基本不可能一眼看完.尤其当创建列表的for循环嵌套在业务逻辑的其他for循环里时,恰恰是使用列表推导式的可读性最高。

推导式的误区

初学者可以这样认为,它只是对 for 循环语句的格式做了一下简单的变形,并用 [] 括起来而已,只不过最大的不同之处在于,列表推导式最终会将循环过程中,计算表达式得到的一系列值组成一个列表。

a_range = range(10)
# 对a_range执行for表达式
a_list = [x * x for x in a_range]
# a_list集合包含10个元素
print(a_list)

上面代码的第 3 行会对 a_range 执行迭代,由于 a_range 相当于包含 10 个元素,因此程序生成的 a_list 同样包含 10 个元素,且每个元素都是 a_range 中每个元素的平方(由表达式 x*x 控制)。

运行上面代码,可以看到如下输出结果:

[0 , 1 , 4 , 9 , 16 , 25 , 36 , 49 , 64, 81]

在列表推导式中添加if语句

我们还可以在列表推导式中添加 if 条件语句,这样列表推导式将只迭代那些符合条件的元素。例如如下代码:

b_list = [x * x for x in a_range if x % 2 == 0]
# a_list集合包含5个元素
print(b_list)

列表推导式中实现多个循环

另外,以上所看到的列表推导式都只有一个循环,实际上它可使用多个循环,就像嵌套循环一样。例如如下代码:

d_list = [(x, y) for x in range(5) for y in range(4)]
# d_list列表包含20个元素
print(d_list)

也支持类似于三层嵌套的 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)

字典推导式

字典推导式实现

上方我们了解了列表推导式,下面来看一下字典推导式的实现,他们的实现方式是一样的。

dict1 = {i: i+1 for i in range(1, 10)}

下面我们来加大难度,将下方字符串以字典推导式的形式定义成字典

cook_str = 'BIDUPSID=3CA9F8; PSTM=1534146048; MCITY=-31080%3A; yjs_duid=1_c2f3f571; BAIDUID=CD8FBB66E5C0'
cook_dict = {i.split('=')[0]: i.split('=')[1] for i in cook_str.split(";")}

以上是关于测开之数据类型进阶篇・第三篇《推导式》的主要内容,如果未能解决你的问题,请参考以下文章

测开之数据类型进阶篇・第四篇《生成器和迭代器》

测开之面向对象进阶篇・《多态》

测开之函数进阶篇・第七篇《装饰器》

测开之函数进阶篇・第六篇《闭包》

测开之面向对象进阶篇・《属性自省》

测开之面向对象进阶篇・《魔术方法》