想象一下一个场景,您想将以下函数作为某个较大项目的一部分来编写:
W¯¯RITE一个函数返回一个三角形的基于三角形的3个边的长度的值的类型。通过假设已经对输入数据类型进行了测试,让我们更容易一些,因此您仅收到要使用的数字值。
这种情况看起来很容易,您可以继续编写如下所示的函数–
算法 :
Input : 3 numeric values
Output : 1 string stating type of triangle
Function : triangleType(side1, side2, side3)
Start :
1. If side1 == side2 == side3
Then Return “Equilateral Triangle”
2. Else if side1 == side2 or side1 == side3 or side2 == side3
Then Return “Isosceles Triangle”
3. Else
Return “Scalar Triangle”
Stop
完成该函数,将给您执行几个断言。令您惊讶的是,您发现只有50%的案件通过了。
让我们看一下测试语句。通过的是:
1.断言(String_toLowerCase(triangle_type(6,7,8))==“标量三角形”)=正确
2.断言(String_toLowerCase(triangle_type(6,6,6))==“等边三角形”)=正确
3. assert(String_toLowerCase(triangle_type(6,7,6))==“等腰三角形”)=正确
好吧,直到现在一切都很好。但是失败的是:
4.断言(String_toLowerCase(triangle_type(0,0,0))==“非三角形”)=不正确
5.断言(String_toLowerCase(triangel_type(-6,-7,-8))==“不是三角形”)=不正确
6.断言(String_toLowerCase(triangle_type(5,3,8))==“非三角形”)=不正确
- 在第4条语句中,输入值为(0,0,0)。现在我们知道(0,0,0)形成一个点而不是一个三角形。实际上,如果任何输入值为零,则三角形是不可能的。但是在我们的情况下,它将返回等边三角形!
- 同样,第5条语句提醒我们长度不能为负值。您会看到一个-30厘米长的刻度。因此,如果我们甚至有一个-ve的长度值,三角形是不可能的。但是在我们的例子中,根据值的不同,它可能会返回3个结果中的任何一个。在这里,它返回一个标量。
- 现在,第六条语句呢?所有值均> = 0,并且肯定是一个标量三角形。还是吗?请记住以下规则:在2个边的三角形总和中,总是大于第3个。
在这里,我们看到:
8 + 3 > 5
8 + 5 > 3
5 + 3 > 8
输出 :
True
True
False
它没有通过三角性检验。因此,长度(3,5,8)不会形成三角形。
因此,我们需要一种适当的三角形验证,它可以告诉我们所拥有的甚至不是三角形。作为解决方案的一部分,您编写了另一个函数,如下所示:
算法 :
Input : 3 sides of the triangle
Output : Boolean value: True if 3 sides form a triangle, false otherwise
Function : triangleValidator(side1, side2, side3)
Start
1. If (side1 <= 0 or side2 <= 0 or side3 <= 0) and
(side2 + side3 > side1) and
(side3 + side1 > side1)
then return True
3. Return False
Stop
我们以前的函数现在在开头和wola中包括2条额外的行!现在所有的测试都通过了。
这只是一个简单的示例场景,提醒我们在编写生产级代码时,即使是简单的事情也必须要小心。通过牢记简单的边缘情况并使用统一的字符串情况进行检查,我们增加了测试范围,并使程序在数学上返回更正确的结果。
下面是上述方法的实现:
# Check if given sides form a triangle or not
def triangleValidator(side1, side2 , side3):
if side1 <= 0 or side2 <= 0 or side3 <= 0:
return False
elif (side1 + side2 > side3) and\
(side2 + side3 > side1) and\
(side3 + side1 > side2):
return True
return False
# Return the type of trinagle
def triangleType(side1, side2, side3):
# If not a triangle, return "Not a triangle"
if triangleValidator(side1, side2, side3) == False:
return "Not A Triangle"
# Else perform type checking
if side1 == side2 == side3:
return "Equilateral Triangle"
elif (side1 == side2) or\
(side2 == side3) or\
(side3 == side1):
return "Isoceles Triangle"
return "Scalar Triangle"
assert (triangleType(6,7,8).lower() == "scalar triangle")
assert (triangleType(6,6,6).lower() == "equilateral triangle")
assert (triangleType(6,7,6).lower() == "isoceles triangle")
assert (triangleType(0,0,0).lower() == "not a triangle")
assert (triangleType(-6,-7,-8).lower() == "not a triangle")
assert (triangleType(5,3,8).lower() == "not a triangle")
成功完成后,不会返回任何输出,表明所有测试均已通过。
输出 :
No output