Python中的比较运算符的求值行为异常

Python中的比较运算符的求值行为异常,python,operator-precedence,Python,Operator Precedence,这学期我正在学习Python的入门课程(使用3.4),最近我遇到了一个关于运算符优先级的练习,并使用括号使语句的计算结果为真 确切的问题是: Add a single pair of parentheses to the expression so that it evaluates to true. 1 < -1 == 3 > 4 向表达式添加一对括号,使其计算结果为true。 1 < -1 == 3 > 4 我认为正确的答案是: 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
向表达式添加一对括号,使其计算结果为true。
1 < -1 == 3 > 4
我认为正确的答案是:

1 < -1 == (3 > 4)
1<-1==(3>4)
考虑到比较运算符都处于相同的优先级,它们应该从左到右求值,因此应该按如下方式求值:

1 < -1 == (3 > 4) 
1 < -1 == False
False == False
True
1<-1==(3>4)
1<-1==错误
假==假
符合事实的
但是当我运行代码时,它仍然返回false。我看到了这个问题,这个表达的结果对我来说很有意义;但是在本例中,我在计算表达式的其余部分之前,强制计算后一个语句,所以我不明白为什么我仍然得到错误的答案


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

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

1 < -1 == (3 > 4) 
1 < -1 == False
1 < -1 and -1 == False
False and False
False
1<-1==(3>4)
1<-1==错误
1<-1和-1==假
假与假
错误的
请注意,我们没有从左到右计算第二行,而是使用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
(1<-1==3>4)
虚假的,微不足道的
(1 < -1) == 3 > 4
False==3>4
False==3和3>4
假与假
错误的
1 < (-1 == 3) > 4
14
14
假与假
错误的
看起来这个问题没有答案

编辑:

哎呀!罗布指出我们忘记了:

1 < -(1 == 3) > 4
1 < -False > 4
1 < 0 > 4
1 < 0 and 0 > 4
False and False
False
1<-(1==3)>4
1<-False>4
1 < 0 > 4
1<0和0>4
假与假
错误的

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

1 < -1 == (3 > 4) 
1 < -1 == False
1 < -1 and -1 == False
False and False
False
1<-1==(3>4)
1<-1==错误
1<-1和-1==假
假与假
错误的
请注意,我们没有从左到右计算第二行,而是使用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
(1<-1==3>4)
虚假的,微不足道的
(1 < -1) == 3 > 4
False==3>4
False==3和3>4
假与假
错误的
1 < (-1 == 3) > 4
14
14
假与假
错误的
看起来这个问题没有答案

编辑:

哎呀!罗布指出我们忘记了:

1 < -(1 == 3) > 4
1 < -False > 4
1 < 0 > 4
1 < 0 and 0 > 4
False and False
False
1<-(1==3)>4
1<-False>4
1 < 0 > 4
1<0和0>4
假与假
错误的

3>4
给出
False
-1==False
给出
False
1
给出
False
。 因此
1<-1==3>4
变为
False

给出适当的括号,使语句在语义上正确

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

3>4
给出
False
-1==False
给出
False
1
给出
False
。 因此
1<-1==3>4
变为
False

给出适当的括号,使语句在语义上正确

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

这项任务显然是不可能完成的。考虑这三种情况:

  • -1
    前面有一个打开的参数

  • -
    1
    之间有一个开放的参数

  • 其他任何地方都有一个开放的公园

  • 这三种情况代表括号的每个可能位置

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

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

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


    因此,在所有可能的情况下,结果都是错误的。

    这项任务是不可能的。考虑这三种情况:

  • -1
    前面有一个打开的参数

  • -
    1
    之间有一个开放的参数

  • 其他任何地方都有一个开放的公园

  • 这三种情况代表括号的每个可能位置

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

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

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

    因此,在所有可能的情况下,结果都是假的。

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

    假==假

    真的

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

    假==假


    是的

    你理解答案中关于比较链接的部分吗?这个答案解释了比较运算符序列如何不按照