推导式:用一行循环判断遍历出一系列数据的方式
注:推导式在使用时只能使用for循环和if判断,if判断只能是单项判断
推导式有三种形式:列表推导式、集合推导式、字典推导式
①普通推导式:通过[]和for形式构成
②带有判断的推导式:通过[] for if形式构成
③多循环推导式:通过[] for for...形式构成
④带有判断条件的循环推导式:通过[] for for if的形式构成
一、列表推导式
eg1:
list_a = [f'data"{i}"'for i in range(100)]
print(list_a)
执行结果:['data"0"', 'data"1"', 'data"2"', 'data"3"', 'data"4"', 'data"5"', 'data"6"',...]
eg2:生成一个['data1', 'data3', 'data5'......'data99']的列表
list_b = [f'data"{i}"'for i in range(100) if i % 2 == 1] # if在最后起过滤作用
print(list_b)
eg3:生成一个['data0', 'num1', 'data2', 'num3'.....'data98', 'num99']的列表
list_c = [f'data"{i}"'if i % 2 == 0 else f'num"{i}"'for i in range(100)] # 'data' if else 'num'做条件判断,循环在后
print(list_c)
# 三元运算符
age = input('输入年龄:')
res = '成年' if age > 17 else '未成年'
print(res)
二、字典推导式
eg1:有一个列表list_d,把它转换为一个下标为key,值为value,字典格式的数据
list_d = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
非推导式做法:
dict_a = {}
for i, j in enumerate(list_d):
dict_a[i] = j
print(dict_a)
推导式做法:
# 语法:{key:value for i in xx}
dict_b = {k: v for k, v in enumerate(list_d)}
print(dict_b)
执行结果:
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g'}
eg2:将如下字符数据转化为字典
cook_str = 'BIDUPSID=D0727533D7147B7;PSTM=1530348042; BAIDUID=B1005C9BC2EB28; sugstore=0;__cfduid=d0a13458f8ac2a;BD_UPN=12314353;ispeed_lsm=2;BDORZ=B490B5EBF6F3CD402'
# 字典推导实现
dict_c = {i.spilt('=')[0].strip(): i.split('=')[1] for i in cook_str.split(';')}
print(dict_c)
# 字典推导式结合列表推导式使用
dict_d = {k.strip(): v for k, v in [i.split('=') for i in cook_str.split(‘;’)]}
print(dict_d)
执行结果:
{'BIDUPSID': 'D0727533D7147B7', 'PSTM': '1530348042', 'BAIDUID': 'B1005C9BC2EB28', 'sugstore': '0', '__cfduid': 'd0a13458f8ac2a', 'BD_UPN': '12314353', 'ispeed_lsm': '2', 'BDORZ': 'B490B5EBF6F3CD402'}
三、集合推导式
eg:
gather_a = {i * 5 for i in range(11)}
print(gather_a)
执行结果:
{0, 35, 5, 40, 10, 45, 15, 50, 20, 25, 30}
PS:
enumerate()函数:用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据下标和数据,一般用在 for 循环当中。
split()函数:拆分字符串,通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list)。
strip()函数:方法用于移除字符串头尾指定的字符(默认为空格或者换行符)或字符序列。
zip()函数:用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
eval()函数:用于类型转换,它可以去掉列表里数据的引号!!!