美文网首页
python 推导式

python 推导式

作者: eeert2 | 来源:发表于2020-03-16 14:55 被阅读0次

    一、什么是推导式

    对于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
    

    相关文章

      网友评论

          本文标题:python 推导式

          本文链接:https://www.haomeiwen.com/subject/wnbgjhtx.html