美文网首页
Effective Python(8): 不要使用含有两个以上的

Effective Python(8): 不要使用含有两个以上的

作者: warmsirius | 来源:发表于2019-09-30 07:21 被阅读0次

    一、多重循环的列表推导

    除了Effective Python(7): 用列表推导来取代map和filter 的基本用法之外,列表推导也支持多重循环

    • 例如,要把矩阵简化成一维列表,使原来的每个单元格都成为新列表中的普通元素。
    matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    flat = [x for row in matrix for x in row]
    print(flat)
    
    >>>
    [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    • 例如,要对二维矩阵中的每个单元格取平方,然后用这些平方值构建新的矩阵。
    squared = [[x**2 for x in row] for row in matrix]
    print(squared)
    
    >>>
    [[1, 4, 9], [16, 25, 36], [49, 64, 81]]
    
    • 更复杂的多层列表循环

    如果表达式里还有一层循环,那么列表推导就会变得很长,这时必须拆分成多行来写,才能看的清楚一些。

    mylist = [
        [[1, 2, 3], [4, 5, 6]],
        # ...
    ]
    
    flat = [x for sublist1 in mylist
              for sublist2 in sublist1
              for x in sublist2]
    

    可以看出,此时的列表推导并没有比普通的写法更加简洁。此时使用for循环语句来实现相同的效果。

    flat = []
    for sublist1 in my_list:
        for sublist2 in sublist1:
            flat.extend(sublist2)
    

    二、多个if条件的列表推导

    每一级循环for表达式后面都可以指定条件,列表推导也支持多个if条件。

    处在同一循环级别中的多项条件,多个if之间默认形成and表达式。

    • 例如,要从数字列表中共选出大于4的偶数,那么下面这两种列表推导方式是等效的
    a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    b = [x for x in a if x > 4 if x % 2 == 0]
    c = [x for x in a if x > 4 and x % 2 == 0]
    
    • 例如,要从原矩阵中把那些本身能为3锁整数,且其所在行的各元素之和又大于等于10的单元格挑出来。
    >>> matrix = [[1, 2, 3], [4, 5, 6], [7,8,9]]
    >>> res = [[x for x in row if x%3==0] for row in matrix if sum(row) > 10]
    >>> res
    [[6], [9]]
    

    这样使用列表推导式虽然能很简短实现,但是这样的代码非常难懂。

    尽管这个例子稍微复杂,但是在事件编程中,逼着强烈建议大家尽量不要编写这种包含复杂式子的列表推导。这样会使其他人很难理解这段代码。这么写虽然能剩下几行空间,但却会给稍后阅读代码的人带来很大的障碍。

    三、要点

    • 在列表推导中,最好不要使用两个以上的表达式。可以使用两个条件、两个循环或一个条件搭配一个循环。
    • 如果代码非常复杂,应该使用普通iffor 语句,并编写辅助函数。

    相关文章

      网友评论

          本文标题:Effective Python(8): 不要使用含有两个以上的

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