zoukankan      html  css  js  c++  java
  • Python基础-12解析式

    12.解析式

        解析式是将一个可迭代对象转换另一个可迭代对象的工具。在Python,容器类型的数据(str,tuple,list,dict,set)都是可迭代对象。

    • 第一个可迭代对象:可以是任何容器类型数据
    • 第二个可迭代对象:生成的最终类型解析式,常见的列表解析如下所示:
      • 列表解析式:可迭代对象为list
      • 集体解析式:可迭代对象为set
      • 字典解析式:可迭代对象为dict

        先来看看其语法格式如下所示:

    # 列表解析式
    [item for item in 可迭代对象 if 条件 ]
    # 集合解析式
    (item for item in 可迭代对象 if 条件 )
    # 字典解析式
    {item for item in 可迭代对象 if 条件 }
    

        从语法格式看起来,就是for循环和if的结合体,但却非常简洁。至于最终生成的数据类型,可以根据其定义的格式就可以猜出。

    12.1 列表解析式

        先来看看一个需求,将0~10以内的偶数挑选出来,并输出其列表结果。实现方法如下所示:

    1.方法1:

    • 通过判断是否能与2整除获取
    evenList=[]
    for item in range(0,11):
        if item%2==0:
            evenList.append(item)
    

    2.方法2

    • 通过控制步长实现
    evenList=[]
    for item in range(0,11,2):
        evenList.append(item)
    

    3.方法3

    • 通过列表解析式
    [item for item in range(0,11) if item%2==0]
    

        以上示例的详细示意图如下所示(以不同颜色进行区分):

    120101列表解析式.png

        在前面学过,for循环是可以进行嵌套的,那多个for循环的是不是也可以使用列表解析式?答案当然是肯定的,下面将演示在给定的路径下递归列出是文件的文件,并以列表的形式返回完整的路径,如下所示:

    import os
    def getfiles(path):
        fileList=[os.path.join(r,f) for r,_,fs in os.walk(path) for f in fs if os.path.isfile(os.path.join(r,f))]
        return fileList
    

    12.2 其他解析式

        另外两种解析(集合、字典)与列表解析都一样,只需要注意在定义时的区别即可。

    1.字典解析式

    # 传统方式
    tempDict={}
    for k,v in (("a","b"),("c","d"),("e","f"),("g","h")):
        if k not in ("g"):
            tempDict[k]=v
    # 字典解析式
    tempDict={k:v for k,v in (("a","b"),("c","d"),("e","f")) if k not in ("g") }
    print(tempDict)
    

    2.集合解析式

    # 传统方式
    tempSet=set()
    for item in (1,1,2,3,4,5,6,7,4,6):
        if item >=2:
            tempSet.add(item)
    # 集合解析式
    tempSet={item for item in (1,1,2,3,4,5,6,7,4,6) if item >=2 }
    

    3.元组解析式

        严格来讲,官方并没有元组解析式这种说法,如果像列表、字典和集合一样,最终生成的是一个生成器对象,如果要想生成的结果为元组的形式,需要使用函数tuple(),如下所示:

    >>> tuple(item for item in (1,1,2,3,4,5,6,7,4,6) if item >=2)
    (2, 3, 4, 5, 6, 7, 4, 6)
    

    12.3 与lambda的结合使用

        lambda可以做为匿名函数使用,当然也可以与解析结合使用,示例如下所示:

    # 将元组拆分为列表
    tmpList=(1,2,3,(4,5,6),(7,8),9,((10,20,30),(40,50)))
    f=lambda x:[ v for item in x for v in f(item)] if isinstance(x,(tuple,)) else [x]
    
    print(f(tmpList))
    

    输出结果为:

    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50]
    

        以上示例是将一个元组拆分为列表形式,元组数据中里面还包含有元组,这需要使用递归。使用lambda表达式和解析式,一行代码就实现,是不是觉得解析很强大?

    本文地址:https://www.cnblogs.com/surpassme/p/12983479.html
    本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:
    MyQRCode.jpg

  • 相关阅读:
    Bootstrap 2.2.2 的新特性
    Apache POI 3.9 发布,性能显著提升
    SQL Relay 0.48 发布,数据库中继器
    ProjectForge 4.2.0 发布,项目管理系统
    红帽企业 Linux 发布 6.4 Beta 版本
    红薯 快速的 MySQL 本地和远程密码破解
    MariaDB 宣布成立基金会
    Percona XtraBackup 2.0.4 发布
    Rocks 6.1 发布,光盘机群解决方案
    精通Servlet研究,HttpServlet的实现追究
  • 原文地址:https://www.cnblogs.com/surpassme/p/12983479.html
Copyright © 2011-2022 走看看