在 Python 中评估比较运算符的行为异常



我本学期正在学习一门关于 Python 的入门课程(使用 3.4),最近遇到了一个关于运算符优先级和使用括号使语句评估为 true 的练习。

确切的问题是:

Add a single pair of parentheses to the expression so that it evaluates to true.
1 < -1 == 3 > 4

我假设正确答案是:

1 < -1 == (3 > 4)

鉴于比较运算符都处于相同的优先级级别,它们应该从左到右计算,因此它应该这样计算:

1 < -1 == (3 > 4) 
1 < -1 == False
False == False
True

但是当我运行代码时,它仍然返回 false。我看到了这个问题比较了 Python 与 C/C++ 中运算符的优先级,该表达式的结果对我来说很有意义;但在这种情况下,我在评估表达式的其余部分之前强制评估后一个语句,所以我不明白为什么我仍然得到错误的答案。

在过去的一个小时里,我一直在盯着它,我觉得我可能忽略了一些明显的东西;如果有人能提供一些关于正确解决方案的见解,将不胜感激。

这项任务被证明是不可能的。请考虑以下三种情况:

  1. -1之前有一个开放的帕伦。

  2. -1之间有一个开放的平衡。

  3. 其他任何地方都有一个开放的帕伦。

这三种情况表示括号的所有可能位置。

在第一种情况下,我们有 1 < ( ... ) ,其中省略号是一个布尔表达式。因为1不小于TrueFalse,所以整个表达式是False

在第二种情况下,我们有 1 < -( ...) ,其中省略号是一个布尔表达式。由于1不小于-True也不小于-False,整个表达式是False

在第三种情况下,我们有1 < -1 == ....由于链式运算符表达式的所有分支都必须为 True,并且由于1 < -1为 False,因此整个表达式False

因此,在每种可能的情况下,结果都是 False。

3>4给出了False-1 == False给了False. 1 < FalseFalse.因此 1 < -1 == 3 > 4变得False.

提供适当的括号以使语句在语义上正确。

(1 < -1) == (3 > 4)

您走在正确的轨道上,但由于比较链接,您将拥有:

1 < -1 == (3 > 4) 
1 < -1 == False
1 < -1 and -1 == False
False and False
False

请注意,我们不是从左到右评估第二行,而是将两个比较与 and 链接在一起。

只有几种有效的方法可以添加一对括号,因此我们可以轻松检查所有其他括号:

(1 < -1 == 3 > 4)
False #Trivially
(1 < -1) == 3 > 4
False == 3 > 4
False == 3 and 3 > 4
False and False
False
1 < (-1 == 3) > 4
1 < False > 4
1 < False and False > 4
False and False
False

看来这个问题没有答案!

编辑:

哎 呦!Rob指出我们忘记了:

1 < -(1 == 3) > 4
1 < -False > 4
1 < 0 > 4
1 < 0 and 0 > 4
False and False
False

(1 <-1) == (3> 4)

假 == 假

相关内容

最新更新