以下程序完全按预期工作:
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,但我不会必须。
答案 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没有进行第三次比较。