美文网首页
2018-10-19 020 列表推导

2018-10-19 020 列表推导

作者: 杜若飞er | 来源:发表于2018-10-19 21:52 被阅读6次
    列表推导

    列表推导是构建列表List的快捷方式,说它是快捷方式,其实就蕴含了两个内在含义:1、它在可读性和执行速度上有优势,2、你当然可以选择不使用这种方法;
    举个例子,我们把一个字符串中的所有元素都转化成其对应的Unicode编码,并把结果储存在一个列表中,从另一种意义上来说,我们也就是从无到有地构建了这个列表,最直观(也是看完了前面十几讲就应该掌握)的方法是:

    Str_Source =  '#$*(HS'
    List_Target = []
    for sep in Str_Source :
        List_Target.append(ord(sep))
    print(List_Target)
    
    #结果如下:
    [35, 36, 42, 40, 72, 83]
    

    这里用了一个For循环,用Sep指代每个元素,并使用Ord()函数讲元素转化成对应的Unicode编码,再后缀到目标列表末尾,关于Unicode编码,等一会儿再提一下;
    那么我们的快捷方式是这样的:

    Str_Source =  '#$*(HS'
    List_Target = [ord(sep) for sep in Str_Source]
    print(List_Target)
    
    #结果如下:
    [35, 36, 42, 40, 72, 83]
    

    列表推导在合理利用的时候会提高执行速度,但列表推导一旦比较冗长或者内里有复杂的逻辑关系,就会造成我们不期望的后果(当然也不会出错),所以虽然列表推导可以强大到完全代替For循环,但仍然建议只把它应用在构建列表方面并且严格限制代码长度(不大于两行是可以接受的);

    还有一点要注意的是,Python还内置了map和filter两个函数,如果写的时候不怕麻烦的话也可以实现相同的功能,而且速度和列表推导半斤八两,这两个函数可能以后会写到吧;

    我们不妨再来尝试一个列表推导的小例子——笛卡尔积;
    笛卡尔积是这样一种东西,我们可以把元素理解成一个具有两种属性的物品,这些属性任意组合的全体就是两个属性的笛卡尔积,最简单的例子就是扑克牌——每一张扑克牌都有花色和数字两种属性,这两种属性所有的组合形式就构成了一套扑克牌;
    就来组合一套扑克牌试试看:

    List_Color = ['♠️' , '♣️' , '♥️' , '♦️']
    List_Numb = ['A',2,3,4,5,6,7,8,9,10,'J','Q','K']
    List_Poker = [(color,numb) for numb in List_Numb
                                for color in List_Color]
    print(List_Poker)
    #结果如下(本菜鸡做了分行):
    [('♠️', 'A'), ('♣️', 'A'), ('♥️', 'A'), ('♦️', 'A'),
     ('♠️', 2), ('♣️', 2), ('♥️', 2), ('♦️', 2),
     ('♠️', 3), ('♣️', 3), ('♥️', 3), ('♦️', 3),
     ('♠️', 4), ('♣️', 4), ('♥️', 4), ('♦️', 4),
     ('♠️', 5), ('♣️', 5), ('♥️', 5), ('♦️', 5), 
     ('♠️', 6), ('♣️', 6), ('♥️', 6), ('♦️', 6),
     ('♠️', 7), ('♣️', 7), ('♥️', 7), ('♦️', 7), 
     ('♠️', 8), ('♣️', 8), ('♥️', 8), ('♦️', 8), 
     ('♠️', 9), ('♣️', 9), ('♥️', 9), ('♦️', 9), 
     ('♠️', 10), ('♣️', 10), ('♥️', 10), ('♦️', 10), 
     ('♠️', 'J'), ('♣️', 'J'), ('♥️', 'J'), ('♦️', 'J'), 
     ('♠️', 'Q'), ('♣️', 'Q'), ('♥️', 'Q'), ('♦️', 'Q'), 
     ('♠️', 'K'), ('♣️', 'K'), ('♥️', 'K'), ('♦️', 'K')]
    

    两层逻辑上的推导之间可以加一个换行,这样代码的可读性就更高了,反正Python不会管这个;

    生成器

    列表推导可以用来建立一个列表,然后我们可以用这个列表来建立其他的卧槽类型,但其实我们也可以直接用生成器表达式来搞定一个其他卧槽类型;
    生成器表达式的语法很简单,就是把列表推导里的[]换成()就完了,它的内在实现方法,我们先留一个坑;
    无论是列表推导还是生成器,都按照Python一个基础的语言架构——迭代而逐渐成型。

    相关文章

      网友评论

          本文标题:2018-10-19 020 列表推导

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