我本学期正在学习一门关于 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
之间有一个开放的平衡。 -
其他任何地方都有一个开放的帕伦。
这三种情况表示括号的所有可能位置。
在第一种情况下,我们有 1 < ( ... )
,其中省略号是一个布尔表达式。因为1
不小于True
或False
,所以整个表达式是False
。
在第二种情况下,我们有 1 < -( ...)
,其中省略号是一个布尔表达式。由于1
不小于-True
也不小于-False
,整个表达式是False
。
在第三种情况下,我们有1 < -1 == ...
.由于链式运算符表达式的所有分支都必须为 True,并且由于1 < -1
为 False,因此整个表达式False
。
因此,在每种可能的情况下,结果都是 False。
3>4
给出了False
。 -1 == False
给了False
. 1 < False
给False
.因此 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)
假 == 假
真