评估 Python 中的比较运算符出现意外行为
Evaluation of comparison operators in Python behaving unexpectedly
我这学期正在学习 Python 的入门课程(使用 3.4),最近遇到了一个关于运算符优先级和使用括号使语句求值为真的练习。
确切的问题是:
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
但是当我 运行 代码时它仍然 returns 错误。我看到了这个问题 comparison operators' priority in Python vs C/C++,这个表达式的结果对我来说很有意义;但在这种情况下,我在评估表达式的其余部分之前强制对后一条语句进行评估,所以我不明白为什么我仍然得到错误的答案。
过去一个小时我一直盯着它看,我觉得我可能忽略了一些明显的东西;如果有人能就正确的解决方案提供一些见解,我们将不胜感激。
您走在正确的轨道上,但由于比较链接,您将拥有:
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
3>4
给出 False
。
-1 == False
给出 False
。
1 < False
给出 False
。
因此,
1 < -1 == 3 > 4
变成 False
.
给出正确的括号使语句在语义上正确。
(1 < -1) == (3 > 4)
该任务已被证明是不可能完成的。考虑这三种情况:
-1
前有一个左括号。
-
和1
之间有一个开括号。
其他任何地方都有一个开放的paren。
这三种情况代表括号的所有可能位置。
在第一种情况下,我们有 1 < ( ... )
,其中省略号是一个布尔表达式。由于 1
不小于 True
或 False
,因此整个表达式为 False
.
在第二种情况下,我们有 1 < -( ...)
,其中省略号是一个布尔表达式。由于 1
不小于 -True
或 -False
,因此整个表达式为 False
.
在第三种情况下,我们有 1 < -1 == ...
。由于链式运算符表达式的所有分支都必须为真,并且 1 < -1
为假,因此整个表达式为 False
.
因此,在所有可能的情况下,结果都是 False。
(1 < -1) == (3 > 4)
假 == 假
正确
我这学期正在学习 Python 的入门课程(使用 3.4),最近遇到了一个关于运算符优先级和使用括号使语句求值为真的练习。
确切的问题是:
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
但是当我 运行 代码时它仍然 returns 错误。我看到了这个问题 comparison operators' priority in Python vs C/C++,这个表达式的结果对我来说很有意义;但在这种情况下,我在评估表达式的其余部分之前强制对后一条语句进行评估,所以我不明白为什么我仍然得到错误的答案。
过去一个小时我一直盯着它看,我觉得我可能忽略了一些明显的东西;如果有人能就正确的解决方案提供一些见解,我们将不胜感激。
您走在正确的轨道上,但由于比较链接,您将拥有:
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
3>4
给出 False
。
-1 == False
给出 False
。
1 < False
给出 False
。
因此,
1 < -1 == 3 > 4
变成 False
.
给出正确的括号使语句在语义上正确。
(1 < -1) == (3 > 4)
该任务已被证明是不可能完成的。考虑这三种情况:
-1
前有一个左括号。-
和1
之间有一个开括号。其他任何地方都有一个开放的paren。
这三种情况代表括号的所有可能位置。
在第一种情况下,我们有 1 < ( ... )
,其中省略号是一个布尔表达式。由于 1
不小于 True
或 False
,因此整个表达式为 False
.
在第二种情况下,我们有 1 < -( ...)
,其中省略号是一个布尔表达式。由于 1
不小于 -True
或 -False
,因此整个表达式为 False
.
在第三种情况下,我们有 1 < -1 == ...
。由于链式运算符表达式的所有分支都必须为真,并且 1 < -1
为假,因此整个表达式为 False
.
因此,在所有可能的情况下,结果都是 False。
(1 < -1) == (3 > 4)
假 == 假
正确