一、什么是推导式
对于list
列表,set
集合,dict
字典,在原有数据上根据条件生成新的数据就是推导式。
它可以帮助我们把一个序列或者其它可迭代类型中的元素过滤
或加工
,然后再新建一个列表
,集合
或字典
如:列表推导式
,两侧用[]
包围
num = [1,2,3,4,5]
double_num = [ n*2 for n in num ]
# double_num = [ 2,4,6,8,10 ]
二、为什么使用推导式
- 使用推导式具有
更高的可读性
并且更高效
;
三、可读性
与高效
如果我们要在一份列表的基础上筛选生成新的列表,那么直接在迭代中增加
/ 删除
列表元素是不可取的,可能会造成问题。
num = [4, 8, 13, 9, 7, 10]
for index, value in enumerate(num):
if value < 10:
del num[index]
print(num) # [8, 13, 7, 10]
我们要对列表进行筛选,就需要提前准备一个空列表[]
new_num = []
num = [4, 8, 13, 9, 7, 10]
for index, value in enumerate(num):
if value >= 10:
new_num.append(value)
print(new_num) # [13, 10]
这样下来对一个过滤
功能我们就写了4
行代码,使事情复杂了。
而使用列表推导式在一行中就可以完成
new_num = [ n for n in num if n >= 10 ]
- 推导式的筛选条件放在最后
同样,使用字典推导式也是如此,只需要将两边的[]
换成{}
例如我们收到一份请求信息,需要对数据进行初步验证,筛选
query_params = {
'name': '',
'password': '',
'user': 2,
'address': '',
}
# 筛选有效的数据
validated_query_params = {
name: value
for name, value in query_params.items()
if value
}
# 返回给上一步的提交者
detail_message = '必填项'
errors_data = {
name: detail_message
for name, value in query_params.items()
if not value
}
print(validated_query_params) # {'user': 2}
print(errors_data) # {'name': '必填项', 'password': '必填项', 'address': '必填项'}
当然,我们也可以提前构造dict
容器,然后再将数据填充到容器中,但是使用推导式
可以获取更高的性能,且一目了然。
四、列表生成式
使用列表推导式可以生成一个新的列表,但对数据比较大的情况下,我们可以使用列表生成式,生成一个生成器,它仅仅是将两侧的[]
改成()
# file 可能是一个很大的文件
# 我们也不能确定它到底有多少行
(line for line in file)
init_list = range(100000000)
double_num = (n * 2 for n in init_list)
print(type(double_num)) # <class 'generator'>
print(next(double_num)) # 0
print(next(double_num)) # 2
print(next(double_num)) # 4
列表生成式
与函数式生成器
生成的结果是一致的,但是列表生成式
更简单明了。
以下是我们使用函数
来实现
init_list = range(100000000)
def double_gene(init):
for value in init:
yield value * 2
double_num = double_gene(init_list)
print(type(double_num)) # <class 'generator'>
print(next(double_num)) # 0
print(next(double_num)) # 2
print(next(double_num)) # 4
网友评论