【问题标题】:Evaluating numerical expressions计算数值表达式
【发布时间】:2012-01-02 09:21:17
【问题描述】:

有人可以向我解释为什么在评估数值表达式时,Python 作为评估的结果返回最后被评估的东西吗?

例如:

3 and 5

评估为

5

我的另一个问题是,当我尝试检查时,它为什么还要评估这些表达式:

3 == True

我得到 False 但当我评估时:

3 and 5

并得到 5 结果它显然(我认为)认为 3 评估为 True 因为如果它认为否则它不会继续评估(我可能在这里错了)。 相反,当我评估时:

0 and 3

我得到 0,我认为正在发生的事情是 Python 检查 0 是否为 True,确定它不是并将其吐出。

如果这听起来有点混乱,我很抱歉,但我在书中偶然发现了这一点,并且很好奇我是否遗漏了什么。

【问题讨论】:

标签: python boolean


【解决方案1】:

是的,在 python 中,任何值要么是真值,要么是假值。除了 0 之外,每个整数都是真实的。使用布尔运算符 orand,python 返回它计算的最后一个表达式,例如 3 or 5 将返回 3,因为 python 首先看到 3 是真实的并且不必计算5 并返回 3。

在 0 和 5 中,0 是假的,因此 python 不计算下一个表达式并返回 0。

5 == True 给出False 的原因是 5 不等于 true,它只是在布尔表达式中表现得真实。 bool(5) == True 给出 True,因为这会将整数显式转换为布尔值。

【讨论】:

  • 无需谈论“原始类型”(更不用说它们通常被称为内置,因为“原始”与限制和优势相关联'不适用于 Python)。 每个对象都有一个真值。
  • 不确定是否存在没有真值的对象。
  • 好吧,似乎可以在__nonzero__(负责转换为布尔值的方法)中抛出异常,从而在确定真值之前中止执行,但默认实现不会并且理智的人也不会这样做。此外,这可以说只是具有未定义的真值,根本没有 noen。
  • @AndrewMarsh,谢谢,我不能接受这个答案,因为它没有解决我已经找到答案的原始问题。
  • @AndrewMarsh,对象可能没有真值:“用户定义的对象可以通过提供 __bool__() 方法来自定义它们的真值。”,所以如果没有这样的方法为对象定义,评估其真实性可能默认为 True 或 False 或者它可能引发异常:-)。
【解决方案2】:

来自 Python 参考:

The expression x and y first evaluates x; if x is false, its value is returned;
otherwise, y is evaluated and the resulting value is returned.

如果你说

0 and 5

第一个评估的值 (0) 将被返回。

对于第二个问题,3 显然在被视为布尔值时计算结果为 true,但 == 运算符不会在比较之前将其参数强制为布尔值。

【讨论】:

  • 你最后一句话是错的。 1 == True0 == False 都是 True
  • @NullUserException - 这是一个灰色区域。 1 == True 中没有强制参数,True 确实 计算为 1。试试这个:list((x % 2 == 1) for x in range(10)),你会得到 [False, True, False, True, False, True, False, True, False, True]。现在将list 更改为sum,得到5,因为True 确实 等于1,False 等于0。
  • @PaulMcGuire 这难道不是进一步证明存在强制,从int到boolean和从boolean到int?
  • 3 == 5 是 FALSE,即使 3 和 5 如果被强制为布尔值,它们也会具有相同的布尔值。 OP 的原始语句 3==True 评估为 False 是正确的,令人惊讶的是 == 强制转换为数字而不是布尔值! 0==真->假。 1==真->真。 2==真->假。 3==真 -> 假。
  • @NullUserException - 不,这意味着 True 和 False 的数值为 1 和 0。3 == True 的计算结果为 False,因此没有强制。你必须明确地说你想要 3 的布尔值,使用 bool(3) == True,它的计算结果为 True。
【解决方案3】:

布尔运算的工作原理

documentation on boolean operations。它们的工作方式如下:

  • a or b 返回第一个被评估为True 的元素,所以在0 or 3 的情况下,它将是3,在3 or 5 的情况下,它也将是3
  • a and b 返回第一个计算为False 的元素,否则(如果所有元素都计算为True)返回最后一个元素,所以0 and 3 将变为03 and 5 将变为@987654334 @,

解决方案

但是您的问题有一个解决方案。只需使用 bool() 将结果转换为布尔值:

>>> bool(0 or 3)
True
>>> bool(3 or 5)
True
>>> bool(0 and 3)
False
>>> bool(3 and 5)
True

有帮助吗?

编辑:

另一种解决方案

实际上,我认为在您的情况下,您的问题可能会有更好的解决方案。看到这个:

  • bool(a or b) 可以替换为any([a, b]),并且
  • bool(a and b)可以替换为all([a, b])

我现在相信这是一个更合理的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多