昨天腊八不知道大家有没有喝腊八粥
今天来讲 Python的一个独有特性 —— 推导式
推导式是一种能从一个数据序列创建另一个数据序列的语法格式。 这句话所有的关于推导式的博客都说过,但是真的太抽象了。根本无法给人直观的理解,所以我给大家先举个例子。
过滤调长度小于或等于3的元素,返回一个新的列表。
names = ['Bob', 'Tom', 'Alice', 'Jerry', 'Wendy', 'Smith']
new_names = [name for name in names if len(name)>3] # 此推导式用的[]包裹 所以返回一个列表
print(new_names)
# ['Alice', 'Jerry', 'Wendy', 'Smith']
推导式有三种:列表(list)推导式、字典(dict)推导式、集合(set)推导式
上面的例子正是列表推导式,所以咱们从列表推导式开始讲。
列表推导式的基本格式:
变量名 = [表达式 for 变量 in 列表] 或
变量名 = [表达式 for 变量 in 列表 if 条件]
第二种具体还可以分为两种
[x for x in data if condition]
x只有满足if条件才能被留下来。if起到了过滤器的作用。
a = [x for x in range(100) if x % 2 == 0]
print(a)
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, .....]
[exp1 if condition else exp2 for x in data]
a = [x if x % 2 == 0 else -x for x in range(100)]
print(a)
# [0, -1, 2, -3, 4, -5, 6, -7, 8, -9, 10, -11, 12, -13, 14, -15, 16, ......]
data中的x满足了if时将其作为exp1处理,否则按exp2处理。if…else起赋值作用
[name for name in names if len(name)>3]
咱们现在把他拆分一下加深理解
name 列表生成元素的表达式,也可以是一个有返回值的函数。
for name in names 迭代names传入表达式
if len(name)>3 根据条件过滤
执行流程:
遍历出列表中的内容给变量,然后过滤,最后进入表达式。最后统一生成一个列表。
多举几个例子:
将lst中每一个元素进行平方后放入到一个新列表中。
lst = [1, 2, 3, 4, 5, 6, 7, 8]
lst = [1, 2, 3, 4, 5, 6, 7, 8]
a = [x**2 for x in lst]
print(a)
# [1, 4, 9, 16, 25, 36, 49, 64]
求出列表中是奇数的值,然后放入一个新列表中。
lst = [1, 2, 3, 4, 5, 6, 7, 8]
lst = [1, 2, 3, 4, 5, 6, 7, 8]
a = [x for x in lst if x % 2 != 0]
print(a)
# [1, 3, 5, 7]
求出列表中所有大于2的偶数进行平方计算
lst = [1, 2, 3, 4, 5, 6, 7, 8]
lst = [1, 2, 3, 4, 5, 6, 7, 8]
a = [x**2 for x in lst if x % 2 == 0]
print(a)
# [4, 16, 36, 64]
求(x, y), 其中x是0-5之间的偶数, y是0-5之间的奇数组成的元组列表。
a = [(x, y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 != 0]
print(a)
# [(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]
求M中3,6,9组成的列表:
M = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
M = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
a = [x[2] for x in M]
print(a)
# [3, 6, 9]
求M中1,5, 9组成的列表:
M = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
M = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
a = [M[x][x] for x in range(len(M))]
print(a)
# [1, 5, 9]
与列表推导式大同小异,具体格式是:
{ key:value for key,value in existing_data_structure }
首先,这个是用{ }包裹的,列表推导式是[ ]。其次因为字典有两个关键的属性,key和value。所以表达式要包含这两个属性。
举个例子:
a = ["A", "B", "C"]
b = ["1", "2", "3"]
c = {k:v for k, v in zip(a,b)}
print(c)
# {'A': '1', 'B': '2', 'C': '3'}
集合推导式和列表推导式也没啥区别,只是[ ] 换成了 { },而且拥有集合的特性—— 去重。
今天三种推导式其实大同小异,也没啥好讲的。主要还是多敲代码多练。
提前祝大家新年快乐,年年有余
谢谢支持,您的支持就是我的动力