&燃气轮机;在Python3三角形练习中返回==

&燃气轮机;在Python3三角形练习中返回==,python,python-3.x,Python,Python 3.x,我是编程新手,这是我第一次问问题,所以如果我违反了任何协议,请提前道歉。我试着在发布前搜索答案,但没有找到任何匹配的结果 我正在以我的方式完成ThinkPython2,下面是我对练习5.3的解决方案,三角形练习 def is_tri(): print('Give me 3 lengths') a = int(input('first?\n')) b = int(input('second?\n')) c = int(input('third?\n'))

我是编程新手,这是我第一次问问题,所以如果我违反了任何协议,请提前道歉。我试着在发布前搜索答案,但没有找到任何匹配的结果

我正在以我的方式完成ThinkPython2,下面是我对练习5.3的解决方案,三角形练习

def is_tri():

    print('Give me 3 lengths')
    a = int(input('first?\n'))
    b = int(input('second?\n'))
    c = int(input('third?\n'))

    if a > b + c or b > a + c or c > a + b:
        print('Not a triangle')

    else:
        print("Yes, it's a triangle")

is_tri()
我注意到,如果我给出3个答案,其中两个长度加在一起等于第三个,即(1,1,2),程序会返回Yes。但2不大于2。我甚至还添加了一系列“和”语句,要求任意两方的总和不得等于第三方,但它仍然返回“是”:

如果(a>b+c或b>a+c或c>a+b)和(a!=b+c和b!=a+c和c!=a+b):


作者提到,等于第三条边的两条边之和是一个“退化三角形”,这可能是预期的结果。但是为什么呢?“>”和“>=”运算符不提供不同的函数吗?我错过什么了吗?如何约束运算符以排除退化三角形?

您的条件清楚地表明,只有当一个长度严格大于其他两个长度之和时,直线长度才不会形成三角形。那不是你想要的条件。如果其中一个大于或等于其他两个之和,则要取消输入的资格

这将有助于:

if a >= b + c or b >= a + c or c >= a + b:

如果需要声明最大边等于其他边之和的三角形无效,则使用了错误的运算符,应将
==
结合使用,因此您的条件如下所示:

if (a > b + c or a == b + c) or (b > a + c or b == a + c ) or (c > a + b or c == a + b):
def is_valid_triangle(triangle_sides):
    triangle_sides = sorted(triangle_sides, reverse=True)

    if triangle_sides[0] >= sum(triangle_sides[1:]):
        return False
    return True


def triangle_validator():
    print('Give me 3 lengths')

    triangle_sides = [
        int(input('first?\n')),
        int(input('second?\n')),
        int(input('third?\n'))
    ]

    if is_valid_triangle(triangle_sides):
        print('Yes, it\'s a triangle')
    else:
        print('Not a triangle')


if __name__ == '__main__':
    triangle_validator()
这和这样做完全一样:

if a >= b + c or b >= a + c or c >= a + b:
一种很好的方法是对列表进行排序以获得最大的元素,然后使用切片将其与其他元素的总和进行比较,为此,您需要将输入放入列表中:

triangle_sides = [int(input('first?\n')), int(input('second?\n')), int(input('third?\n'))]

triangle_sides = sorted(triangle_sides, reverse=True)

if triangle_sides[0] >= sum(triangle_sides[1:]):
    print("Absolutelly not a triangle")
else:
    print("Congratulations, its a triangle")
我还建议您从函数外部获取输入,将“用户界面”与逻辑分离,您的脚本如下所示:

if (a > b + c or a == b + c) or (b > a + c or b == a + c ) or (c > a + b or c == a + b):
def is_valid_triangle(triangle_sides):
    triangle_sides = sorted(triangle_sides, reverse=True)

    if triangle_sides[0] >= sum(triangle_sides[1:]):
        return False
    return True


def triangle_validator():
    print('Give me 3 lengths')

    triangle_sides = [
        int(input('first?\n')),
        int(input('second?\n')),
        int(input('third?\n'))
    ]

    if is_valid_triangle(triangle_sides):
        print('Yes, it\'s a triangle')
    else:
        print('Not a triangle')


if __name__ == '__main__':
    triangle_validator()

看来你的情况不对
c
必须小于或等于
a+b
才能不是三角形。啊,当然,我现在看到了!我把条件句弄混了。我总是觉得逻辑不那么混乱。谢谢感谢您提供的丰富信息!你也回答了我接下来的两个问题。至于函数中的输入,练习特别要求我们编写一个函数,获取输入,将其转换为整数,然后应用is_三角形函数,所以我一次完成了所有操作,但我发现您也满足了这些标准,同时也保持了分离。谢谢你的提示!不客气,@whitehorse!你能接受这个答案吗D