【问题标题】:How to understand Python list comprehension when using 'and' or 'or' in derivation formula?在推导公式中使用“和”或“或”时如何理解 Python 列表理解?
【发布时间】:2019-05-25 08:49:48
【问题描述】:

在列表理解中使用“and”或“or”,但结果不例外。为什么?

> [print(i) and print(i) for i in range(1)] 
0

> [print(i) or print(i) for i in range(1)]
0
0

【问题讨论】:

  • 您的预期结果是什么?这段代码的初衷是什么?一方面,您不应该将列表推导用于副作用。至于为什么它打印两次而不是一次,print 返回None,所以and 只需要评估一个操作数就知道整体结果将是 false-y 而or 需要检查第二个如果第一个 不是真实的。
  • Print 返回一个 NoneType,其计算结果为 False。因此,如果您说 None 和 None 返回 None 并且如果您说 None 或 None 也评估为 False。

标签: python list-comprehension


【解决方案1】:

andor 运算符支持惰性求值或短路。

在你的第一个例子中:

[print(i) and print(i) for i in range(1)]

首先,print(i) 被执行,写入标准输出。它不返回任何内容 (None)。现在 python 知道这个表达式是and 操作的一部分。由于None 有一个假布尔值,因此评估第二个print 没有意义,因为第一个print 需要返回一个真布尔值。

第二个:

[print(i) or print(i) for i in range(1)]

同样的事情开始了。由于存在or,因此评估第二个print,因为它有可能成功。这就是为什么将两个 0 写入标准输出的原因。

两者的实际结果都丢失了,因为列表推导式没有分配给任何东西。两者的结果都是[None]。 2 个逻辑运算符确实检查布尔值,但也返回所涉及的对象。

对于x and y,对象y 总是返回。 与x or y

  • 如果x 是“真实”对象,则返回x
  • 否则返回y

【讨论】:

    【解决方案2】:

    这与列表理解无关:

    >>> print(0) and print(0)
    0
    >>> print(0) or print(0)
    0
    0
    

    这是normal behavior of boolean operators in Python

    表达式 x 和 y 首先计算 x;如果 x 为 false,则返回其值

    表达式 x 或 y 先计算 x;如果 x 为真,则返回其值;否则,求值并返回结果值。

    (见https://en.wikipedia.org/wiki/Short-circuit_evaluation)。

    如果你知道print(0) 返回None

    >>> print(0) is None
    0
    True
    

    还有:

    以下值被解释为 false:False、None、所有类型的数字零以及空字符串和容器

    你有你的答案:

    • and 案例:评估 print(0)(打印 0 作为副作用),即为 false 并返回其值 (None)
    • or 案例:评估print(0)(打印0),即为假,然后评估第二个print(0)(打印0)返回其值(None)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多