python 推导式

2020-03-16  本文已影响0人  eeert2

一、什么是推导式

对于list列表,set集合,dict字典,在原有数据上根据条件生成新的数据就是推导式。

它可以帮助我们把一个序列或者其它可迭代类型中的元素过滤加工,然后再新建一个列表集合字典
如:列表推导式,两侧用[]包围

num = [1,2,3,4,5]
double_num = [ n*2 for n in num ]
# double_num = [ 2,4,6,8,10 ]

二、为什么使用推导式

  1. 使用推导式具有更高的可读性并且更高效;

三、可读性高效

如果我们要在一份列表的基础上筛选生成新的列表,那么直接在迭代中增加 / 删除列表元素是不可取的,可能会造成问题。

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
上一篇下一篇

猜你喜欢

热点阅读