置顶 Python调试技巧案例分析
发布于 2019-08-29 09:45 36126 次浏览 4 赞 来自 试题交流  

对于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也肯定会报错。接下来就可以开开心心改算法了。


18 条回复

不是,没写try except也没有把错误抛出来啊。要不是考试我也不想在贵平台上浪费时间了。

2020-03-11 20:04
47

testBB

2020-03-14 12:53
1
coder_PDKVADUM 回复 coder_xTFRV7N7

同python,9%,并且runtime error

2020-03-25 16:51

最近部门新增一块业务,是公司级别最高优先级的项目,所以新增HC20+个,包含后端、测试、前端岗位等等。


机不可失,想抓住机会➡➡➡蚂蚁金服-社招内推-必读:

https://lnkd.in/f8Pq2dU


2020-04-08 16:14

不是为了考试要用这个东西,真有人平时用这个oj的??


2020-04-18 16:50
7

纯粹就是用来恶心人的

2020-07-22 09:27
2

听不听由你,反正浪费的不是我的时间,是你通往offer之路的时间哦!

2020-07-29 21:49

说实话,这赛马比牛客更垃圾,简直是垃圾中的垃圾

2020-08-15 15:49
9

第一次:只有一句print(1)报错,过了一会再回来,再运行打印出来,这稳定性是日了狗



2020-09-03 11:57
coder_3FT9GFUG 回复 coder_I1SNkdbA

我TM也是 习惯用print来找bug看哪里出问题了结果TM经常连最普通的print都出不来

2020-09-08 23:54
coder_YR26JGDK 回复 coder_8PAVSX7J

有找到解决方法么,我这边同样没有try也不报错,而且连print都没法print,根本没法debug

2020-09-12 20:36

编译器做的这么垃圾 还不让人吐槽了?

2020-09-13 13:28
1

反正我是不会怀疑编译器的错,当程序员就要有一出bug就怀疑自己程序哪里写错的觉悟,实在不行刷新一下页面,再不济用本地编译器去调试,方法多的时,干嘛无能狂怒啊

2020-10-10 14:33

无力吐槽,只能适应,他妈的报个错会死吗?编译器不会搞远程编译吗?编译完把结果远程回复嘛,搞得垃圾的要死的编译器

2020-10-11 13:19
1

考试不让跳出,本地无法debug??

用这个平台考试是想让人用java写AI?????

2021-03-03 21:43

这是我用过最垃圾的编译器了,相同代码有时候能跑有时候不能跑,美团怎么会选这个来笔试,想不通。

2021-03-25 16:53

python中 一个tab不能当四个空格用,我真的不知道该说啥了

2021-09-08 03:00
添加回复
回到顶部