这是我的代码:
n=int(input())
if 2<=n and 5>=n and n%2==0:
print("Not Wierd")
elif 1<=n and 5>=n and n%2!=0:
print("Wierd")
elif 6<=n and 20>=n:
print("Wierd")
elif 21<=n and n%2==0:
print("Not Wierd")
else:
print("Wierd")
在此程序中,n = 21没有给出有效的输出。
预期:Wierd
,但完全没有输出。
答案 0 :(得分:1)
以下是一些提示,以解释一段代码的错误。我在下面详细介绍了将来如何调试代码。
在此步骤中,我们创建一个以n
作为参数的可重用函数。我们将使用它来模拟真实程序的多次执行。
def testWeird(n):
if 2<=n and 5>=n and n%2==0:
print("Not Wierd")
elif 1<=n and 5>=n and n%2!=0:
print("Wierd")
elif 6<=n and 20>=n:
print("Wierd")
elif 21<=n and n%2==0:
print("Not Wierd")
else:
print("Wierd")
标准做法是从左到右(n >= 2
)比较变量和常量。向后写比较(2<=n
)使代码更难阅读。在变量,常量和运算符之间添加一些空格也有助于阅读。
我已经修改了以下n项的测试。现在很明显,我们正在测试范围2-5和1-5分别为偶数和奇数。
除了改善if语句的构造之外,我们还通过打印测试值来改善输出。在比较testWeird
不同迭代的输出时,这特别有用。
def testWeird(n):
if (2 <= n <= 5) and (n % 2 == 0):
print (`n` + ": Not Weird")
elif (1 <= n <= 5) and (n % 2 != 0):
print (`n` + ": Weird")
elif (6 <= n <= 20):
print (`n` + ": Weird")
elif (n >= 21) and (n % 2 == 0):
print(`n` + ": Not Weird")
else:
print(`n` + ": Weird")
您会注意到,我们在原始代码中重新计算了(n % 2 == 0)
。此外,我们测试了不等于变体的奇数。我们可以通过一次计算isEven
并将其重新用作命名变量来澄清所有这些问题。
def testWeird(n):
isEven = (n % 2 == 0)
if (2 <= n <= 5) and isEven:
print (`n` + ": Not Weird")
elif (1 <= n <= 5) and (not isEven):
print (`n` + ": Weird")
elif (6 <= n <= 20):
print (`n` + ": Weird")
elif n >= 21 and isEven:
print(`n` + ": Not Weird")
else:
print(`n` + ": Weird")
现在,我们花一些时间通过手动检查简化逻辑。我们正在通过减少下一个开发人员必须评估的操作来优化阅读能力。第一个范围(2到5)仅在n = 2或n = 4时才有效。因此,我们可以更简单地将测试重写为n == 2 or n == 4
。我们对1-5范围的奇数测试应用了类似的变换。
让我们花一点时间将此版本与原始版本进行比较。现在很明显,我们将数字1-20定义为具有硬编码的怪异/不怪异状态。高于20的数字只是根据它们是否偶数而交替出现。
在原始版本中,读者必须推断(n % 2 == 0)
的含义。通过命名该输出,可以帮助指导下一个开发人员对代码的理解。我们的静态分析表明,被测试的范围没有重叠,并且大多数偶/奇检查都被消耗在编译时推理中。
def testWeird(n):
isEven = (n % 2 == 0)
if n == 2 or n == 4:
print (`n` + ": Not Weird")
elif n == 1 or n == 3 or n == 5:
print (`n` + ": Weird")
elif 6 <= n <= 20:
print (`n` + ": Weird")
elif n >= 21 and isEven:
print(`n` + ": Not Weird")
else:
print(`n` + ": Weird")
在此过程的每个阶段,我们都可以使用以下代码段测试此例程。
for n in range(0, 30):
testWeird(n)
0: Weird
1: Weird
2: Not Weird
3: Weird
4: Not Weird
5: Weird
6: Weird
7: Weird
8: Weird
9: Weird
10: Weird
11: Weird
12: Weird
13: Weird
14: Weird
15: Weird
16: Weird
17: Weird
18: Weird
19: Weird
20: Weird
21: Weird
22: Not Weird
23: Weird
24: Not Weird
25: Weird
26: Not Weird
27: Weird
28: Not Weird
29: Weird