当我们对一批可迭代的数据(如列表或字典)进行提取或处理,最后要得到一个新的列表或字典时,推导式是一种非常简洁的表达方式。
列表推导式
比如,有一批数据
data = [
{'name': '张三', 'gender': 'male', 'age': 12},
{'name': '李四', 'gender': 'female', 'age': 10},
{'name': '王五', 'gender': 'male', 'age': 20},
{'name': '赵六', 'gender': 'male', 'age': 11},
{'name': '周七', 'gender': 'female', 'age': 16},
{'name': '孙八', 'gender': 'male', 'age': 13},
]
我们想要把数据中的name都提取出来形成一个新的列表,一般的操作是这样的。
names = [] # 定义一个空列表
for item in data: # 遍历数据
name = item['name'] # 提取每行中的name
names.append(name) # 追加到列表中
如果用推导式的话,形式如下。
names = [item['name'] for item in data] # 遍历data,提取每项中的name生成一个新列表
数据处理
在提取数据时,我们还可以对每一项数据进行,处理,假设我们需要每个名称前加上'姓名: '这个字符串,可以这样。
names = ['姓名: '+item['name'] for item in data]
'姓名: '+item['name']
就是每一项的数据
数据筛选
同样我们还可以对数据进行筛选,比如我们只要年龄大于12岁,后面可以使用if进行过滤
names = [item['name'] for item in data if item['age']>12]
多重循环
推导式还支持多重循环,比如
for x in range(1,5)
if x > 2
for y in range(1,4)
if y < 3
x*y
使用推导式表示如下
[x*y for x in range(1,5) if x > 2 for y in range(1,4) if y < 3]
批量执行操作
由于推导式就是一种循环操作,我们也可以使用推导式来批量执行一些相似操作,比如:
def step1(driver):
print('步骤1)
def step2(driver):
print('步骤2)
def step3(driver):
print('步骤3)
我们可以将函数名放到一个列表里,然后使用推导式循环执行
steps = [step1, step2, step3] # 函数名列表
[step(driver) for step in steps] # 不需要变量接收,我们只需要它循环执行
字典推导式
当我们需要遍历一批数据最后得到一个字典时,同样可以使用字典推导式,如:
data = [
{'name': '张三', 'gender': 'male', 'age': 12},
{'name': '李四', 'gender': 'female', 'age': 10},
{'name': '王五', 'gender': 'male', 'age': 20},
{'name': '赵六', 'gender': 'male', 'age': 11},
{'name': '周七', 'gender': 'female', 'age': 16},
{'name': '孙八', 'gender': 'male', 'age': 13},
]
假设我们想得到一个{'张三': 12, '李四': 10, ....}
这样的一个字典,使用字典推导式方式如下:
persons = {item['name']: item['age'] for item in data}
字典推导式同样支持if筛选等操作。
生成器
生成器实际上是一种包含初始数据和推导法则的对象,比如我们可以轻松的写出1w以内所有的奇数,原因是因为我只需要记住从1开始每次加2即可。
生成器便是这样。对应大量的数据或者CSV/Excel文件中的数据,生成器可以大量的节省内存,比如csv.Reader(f)就是一个生成器,只存了当前位置和读取下一行数据的方法。
当你需要遍历时,它再每次给你读取一行数据给你。
如列表推导式的例子,
data = [
{'name': '张三', 'gender': 'male', 'age': 12},
{'name': '李四', 'gender': 'female', 'age': 10},
{'name': '王五', 'gender': 'male', 'age': 20},
{'name': '赵六', 'gender': 'male', 'age': 11},
{'name': '周七', 'gender': 'female', 'age': 16},
{'name': '孙八', 'gender': 'male', 'age': 13},
]
names = [item['name'] for item in data]
我们把列表的中括号改为小括号就得到一个生成器
names2 = (item['name'] for item in data)
注意:生成器和推导式不同,其中的循环不是立即执行的,只用你遍历这个生成器时才会执行
for name in names: # 遍历列表推导式生成的新列表
print(name)
for name in names2: # 遍历一个生成器
print(name)
两个打印结果是一样的,生成器更节省内存,只有遍历时才运行。