多个!=与==运算符

时间:2018-02-04 16:09:08

标签: python-3.6 comparison-operators

以下程序完全按预期工作:

data = input("Input the length of three sides of a triangle: ").strip()

if data.count(',') != 2:
    print("You did not enter the lengths of three sides: ")

a, b, c = data.split(', ')


def triangle_type(s1, s2, s3):
    if s1 == s2 == s3:
        return print("The values entered represent an equilateral triangle.")
    elif s1 != s2 and s1 != s3 and s2 != s3:
        return print("The values entered represent a scalene triangle.")
    else:
        if s1 == s2 or s1 == s3 or s2 == s3:
            return print("The values entered represent an isosceles triangle.")


triangle_type(int(a), int(b), int(c))

但是,如果我将第二个条件更改为以下条件:

elif s1 != s2 != s3:

它没有按预期工作。

如果我输入3,6,3,我得到:

Input the length of three sides of a triangle: 3, 6, 3
The values entered represent a scalene triangle.

这是不正确的。这应该明显符合条件#3(等腰)。

它与代码的第一个版本一起正常工作。

我对两件事感到困惑:

1)为什么第二个版本工作不正常?

2)如果第二个版本无效,那么为什么第一个条件有效 正确?

考虑到!=运算符的上述行为,我希望必须将== b == c视为a == b和a == c和b == c,但我不会必须。

2 个答案:

答案 0 :(得分:1)

链式版本相当于s1 != s2 and s2 != s3;它不需要s1 != s3,因为不等式不是传递性的。

答案 1 :(得分:1)

当您在Python中进行比较时,and将它们组合在一起,并且它只进行与比较运算符一样多的比较。所以

if s1 == s2 == s3:

相当于

if s1 == s2 and s2 == s3:

这是有效的,因为如果这两个条件都是True,则s1 必须也等于s3(因为它们都相等)到s2)。

然而

if s1 != s2 != s3:

相当于

if s1 != s2 and s2 != s3:

正如您所发现的,对于值3,6和3,上述两个条件为True,但第三个假设条件(s1 != s3)不是True }。这并不像你期望的那样有效,因为Python没有进行第三次比较。