对于Python,由于某些考生提交的代码有缺陷,没有输出任何东西,这时候考生往往就会怀疑是不是编译器有问题。其实在这里可以肯定地告诉大家,编译器是没有任何问题的。如果大家把时间花在抱怨编译器的事情上,我觉得就是浪费时间(听不听由你,反正浪费的不是我的时间,是你通往offer之路的时间哦!),各位考生应该花时间在调试上,这才是获得AC的正确道路。
如果我有空,我会陆陆续续上一些调试技巧类的文章。事先声明,我这些文章是完全义务的,免费的,我只能趁工作不忙的时候写,望能帮助大家一起把调试技巧涨起来。也希望各位能提出建设性的建议,让大家快乐考试(当然只是梦想,考试怎么能快乐呢)。
案例1:
问题描述:
已知一元一次方程,以x为未知数,求方程的根
输入描述:
一元一次方程,标准形式,以x为未知数,右侧为'=0'。中间可能存在空格。
输出描述:
方程的解表达式,中间为等号,等号两边没有空格,解四舍五入保留一位小数
输入样例:
-x - 10 = 0
输出样例:
x=-10.0
某位考生的答案:
import sys
def solution():
try:
while True:
s = input().strip()
s=s.split('=')
s = s[0] if 'x' in s[0] else s[1]
if '+' in s:
s=s.split('+')
a = s[0] if 'x' in s[0] else s[1]
b = s[0] if 'x' not in s[0] else s[1]
a = float(a.replace('x',''))
b = float(b)
print('x=%.1f' %(-b/a))
else:
s=s.split('-')
a = s[0] if 'x' in s[0] else s[1]
b = s[0] if 'x' not in s[0] else s[1]
a = float(a.replace('x', ''))
b = float(b)
print('x=%.1f' % (b / a))
except:
pass
solution()
该考生觉得能AC,但是,往考试系统一提交,发现并没有AC,这个时候真的不要抱怨编译器,继续调试下去。
首先我们想到的是打开“自定义数据”进行调试,录入测试用例“-x - 10 = 0”,发现并没有任何输出。
这个时候有可能心里开骂了,赛码网垃圾,编译器没有任何输出。以后赛码网的考试我都不参加了。
在这里我不想说啥,坚强有意志的人肯定不会去抱怨的,而是去分析为什么会没有输出,唯一的手段就是review代码并进行调试。
通过review,我们发现,使用了try ... exception: pass,这会忽略任何错误。所以,调试时,最好把try先注释掉。这个时候,终于可以看到报错了。
如果还看不明白这个报错是什么意思,或者并没有发现try的事情,那么该如何调试呢?
其实很简单,进行print埋点,打印出相关变量的值。
可以看到,a的值是x,b的值是空,所以对a进行replace和float后,肯定会报错。同理,对b进行float也肯定会报错。接下来就可以开开心心改算法了。