zoukankan      html  css  js  c++  java
  • 第8条:不要使用含有两个以上表达式的列表推导

    核心知识点:

    1.列表推导式支持多级循环,每一级循环也支持多项条件。

    2.列表推导式的读取按照从左往右的顺序来评估,如果有括号,括号里面的优先读取。

    3.超过两个表达式的列表推导式非常不好理解,应该尽量避免。

    列表推导式除了基本的用法之外,也支持多重循环。

    例如,要把一个矩阵(也就是含有列表的列表,即二维列表)简化成一维列表,使原来的每个单元格都成为新列表中的元素。

    这个功能采用包含两个for 表达式的列表推导式即可,这些for表达式会按照从左至右的顺序来评估

    >>> list1 = [[1,2,3],[4,5,6],[7,8,9]]
    >>> list2 = [x for row in list1 for x in row]
    >>> print(list2)
    [1, 2, 3, 4, 5, 6, 7, 8, 9]

    上面的例子简单易懂,也是多重循环的合理用法,但是如果我们要对矩阵中的每个单元格取平方,那就会稍微麻烦一点。

    >>> list3 = [[x**2 for x in row] for row in list1]  #有括号先计算括号里面的
    >>> print(list3)
    [[1, 4, 9], [16, 25, 36], [49, 64, 81]]

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

    >>> a = [
    ...     [[1,2,3],[4,5,6]],
    ...     [[7,8,9],[10,11,12]],
    ...     [[13,14,15],[16,17,18]]
    ... ]

    使用列表推导不好做,此时使用循环还简单一点。

    >>> a1 = []
    >>> for one in a:
    ...     for two in one:
    ...         for x in two:
    ...             a1.append(x)
    ...
    >>> print(a1)
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]

    列表推导式还支持多个if条件。处在同一级别中的多项条件,彼此之间默认形成and表达式。

    例如,要从数字列表中选出大于4的偶数,那么下面两种推导方式等价。

    >>> a = [1,2,3,4,5,6,7,8,9,10]
    >>> b = [x for x in a if x > 4 and x % 2 == 0]
    >>> c = [x for x in a if x > 4 if x % 2 == 0]
    >>> print(b)
    [6, 8, 10]
    >>> print(c)
    [6, 8, 10]

    每一级循环的for表达式后面都可以指定条件,但是代码会非常难懂。

    在列表推导式中,最好不要使用两个以上的表达式。可以使用两个条件、两个循环或一个条件搭配一个循环。

    如果写的代码比这还要复杂,那就应该使用普通的if和for语句,并编写辅助函数。

  • 相关阅读:
    git 操作
    移动端Web开发注意事项(响应式)
    jQuery插件通用写法
    关于清除浮动(BFC),float和inline-block
    js和css的顺序关系及js加载执行优化探索
    表单验证
    日期比较
    常用正则表达式
    js事件线程机制和异步执行
    阻止事件冒泡
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/8001775.html
Copyright © 2011-2022 走看看