• Python中的推导式及生成器


    当我们对一批可迭代的数据(如列表或字典)进行提取或处理,最后要得到一个新的列表或字典时,推导式是一种非常简洁的表达方式。

    列表推导式

    比如,有一批数据

    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)
    

    两个打印结果是一样的,生成器更节省内存,只有遍历时才运行。

  • 相关阅读:
    Centos 6.8安装配置KVM
    使用明小子进行网页渗透测试-XYCMS企业建站系统2.3(鑫跃教育)
    VSFTP2.3.4(笑脸漏洞)渗透测试
    MS08_067smb漏洞利用渗透测试
    css基本概念与css核心语法介绍
    HTML块级、行级元素,特殊字符,嵌套规则
    网页DIV+CSS布局与ifame传统布局对比
    html基本标签表单实现交互原理,单选框,复选框,下拉框介绍
    HTML基础标签图片文本超链接列表表格介绍
    html网页基本结构
  • 原文地址:https://www.cnblogs.com/superhin/p/13877327.html
Copyright © 2020-2023  润新知