【问题标题】:How do 'and' and 'or' act with non-boolean values in Python? [duplicate]'and' 和 'or' 如何在 Python 中处理非布尔值? [复制]
【发布时间】:2012-04-05 13:16:10
【问题描述】:
22 and 333/12 or 1

我遇到过上面这行代码。结果是 27,但我不太明白 andor 在这种情况下是什么意思。有人可以向我解释一下,最好有例子。提前致谢!!

【问题讨论】:

  • 请注意,如果您希望它在条件为 True 时生成 False 值,则此技巧不起作用——22 and None or 1 将给出 1 而不是 None(None, 1)[22] 确实有效,只要可以评估 True 和 False 值,因为它不会短路。

标签: python syntax


【解决方案1】:

A and B 如果 A 为假则返回 A,否则返回 B:

>>> 0 and 1
0
>>> False and True
False
>>> True and 'yes'
'yes'
>>> True and ''
''

同样,如果 A 为真,'A or B' 返回 A,否则返回 B:

>>> 0 or 1
1
>>> False or True
True
>>> '' or 'yes'
'yes'
>>> False or ''
''
>>> 'yes' or ''
'yes'

【讨论】:

  • 由于and在Python中的优先级高于or22 and 333/27被评估而不是333/12 or 0 and 333/27 or 1 将返回 1
【解决方案2】:

让我们把它分开:

22 and 333/12 or 1
(22 and 333/12) or (1) # Parentheses are nice
(22 and 27) or (1)     # 333/12 = 27 because you are using integers for division
22 and 27              # 22 and 27 is True, as neither of them is False
27                     # Not sure why anything is returned, but the second
                       # value always returned if it is True

【讨论】:

    【解决方案3】:

    逻辑操作数 and,or 将在此特定场景中根据优先规则出现在除法运算符之后。

    首先它将计算 333/12,即 27,然后它会变成 22 和 27 或 1,这相当于 27 和,或具有相同的优先级。

    22 and 333/12 or 1
    22 and 27 or 1
    (22 and 27) or 1  OR 22 and (27 or 1)
    
    27 ,27
    

    但对于 Python 3.2,它的计算结果为 27.75。

    >>> 22 and 333/12 or 1
    27.75
    >>> (22 and 333/12) or 1
    27.75
    >>> 22 and (333/12 or 1)
    27.75
    

    【讨论】:

    • andor 之前进行评估,请参阅其他答案。
    【解决方案4】:

    这是 "and-or trick" -- andor 实际上并不返回布尔值;相反,它们返回其输入参数之一。人们过去常常将其用于控制​​流。

    从 python 2.5 开始,不再需要,因为引入了条件表达式。

    22 and 333/12 or 1
    

    等价于

    333/12 if 22 else 1
    

    【讨论】:

    • if else”可读性更强。我希望人们不再使用 and/or 技巧。
    • 我认为内联 if ... else ... 未在较旧的 Python 版本中实现,因此支持它们的脚本可能仍会使用它。
    • @Anorov 这不仅仅是可读性,请参阅我对这个问题的评论。
    • “和-或技巧”链接已损坏。 cond and x or y 不是 x if cond else y 的逻辑等价物。正确的等价物是 (cond and [x] or [y])[0]
    【解决方案5】:

    在 Python 中,出于布尔表达式的目的,非零数被视为真,而零被视为假。因此,即使 andor 通常与布尔值 TrueFalse 一起使用,它们也可以与数字一起使用。

    问题是:像10 and 3 这样的表达式的值是多少,其中两个值都为真?在具有类似整数作为布尔语义的 C 中,10 && 3 的值为 1,这是最常用的真值。然而,在 Python 中,这个表达式的值为 3,即 and 表达式的后半部分。这是有道理的,因为和短路,这意味着 0 and 3 是 0,所以 and 具有“如果它是假的,取第一个值,否则取第二个”语义。

    你发布的表情呢?按运算符优先级,与

    相同
    (22 and 333/12) or 1
    

    22 and 333/12 的值为333/12,即 27。由于 or 运算符短路,Python 解释器在计算 27 or 1 时取第一个真值,得到 27。

    【讨论】:

      猜你喜欢
      • 2020-10-12
      • 2022-07-29
      • 2013-07-09
      • 1970-01-01
      相关资源
      最近更新 更多