这两年教Python编程,学生基本都是0基础小白,他们犯的各种错误非常天真,有时还很有想象力,分享出来,大家瞧瞧,自己或自己的学生,有则改之,无则一笑。
一、不知道程序是顺序执行的
有小白写道:
a = b + c
b?=?int(input())
c?=?int(input())
print(a)
希望打出b、c之和。小白的心路历程如下:我一开始就讲得很清楚了,a等于b加c啊。后面我又告诉你b和c是输入来的,小白都应该知道打出a自然应该是b、c之和嘛。可惜Python解释器很笨,看不懂他那高级的倒叙写作手法。程序是顺序执行的,对老师来说这好像是天经地义,甚至用不着说。但总有个别学生不明白这句话的真实含义,如果提都没提,他们就完全没有概念了。
二、不知道中文标点符号用不得
曾经有组织某著名编程等级考试的老师告诉我,每次考试都有考生连打印"hello,world"都写不出0分而返。我说怎么可能,知道自己一行程序都不会写还去考,还不如吃饱撑死算了。这位老师说,这些人都因为对考试提供的机器环境不够熟悉,把引号或者括号或者空格打成了中文全角的了。英语还不好看不懂错误信息,结果死活都过不了。我听完感觉就是他们的机器好坑。后来发现小白们犯这个错误真的很普遍,而且他们对着Pycharm在全角标点下面画出来的血淋淋红线也义无反顾勇往直前。
三、误以为字符串里面可以包含变量
s =
print("I am s m tall")
小白天真地想,我前面说了s=了,傻子都应该知道,那个字符串里的s就是嘛,所以应该输出 I am1. m tall。想得美。当然还有更过分的,觉得print("4+5")应该输出9。
四、想用字符串却不加引号
print(hello,world)就想输出hello,world, print(a/nb)就想输出a的值,换行,然后输出b的值。放荡不羁,天马行空。
五、误把除号当分数线
亲们,/ 是 ÷ ,不是分子分母之间的分数线啊!因此a/b*c是a÷b×c,不是a/(b*c)。
六、在Python程序中野蛮使用代数思维
写个(a+b)c,就觉得是(a+b)*c, 2c就是两倍的c, |x|就是绝对值x。虽然没人告诉他们可以这么干。大概法律系的学生爱犯这种错误,还以为法不禁止即可为呢。
七、抗拒elif
也不知道是elif不好记,还是本身就是错别字惹人讨厌,许多小白在本该用if...elif...elif...的地方就是不用elif,而是写多个并列的if。比如:
if a < 3:
???????.....
elif?a>=?3?and?a?
???????......
在小白看来,和
if a < 3:
???????.....
if?a?>=?3?and?a?
???????......
没区别,反正那两个条件都是最多只可能满足一个。应该这么教育他们:
if你有不到3块钱:
???????我给你7元
elif?你的钱不少于3块但不到块
???????你给我2块
能和:
if 你有不到3块钱:
???????我给你7块
if 你的钱不少于3块但不到块
???????你给我2块
一样吗?
八、追求界面友好的圣母心
在OJ(在线程序评测平台)上做题,总有学生输入的时候喜欢写:
a = input("亲,请输入一个数:") 这样,显得非常人性化。只不过你的程序是给OJ服务器用的,它不需要人性化,它只会觉得你啰里啰唆然后给你个Wrong Answer。
九、不知道input()一次会输入一行
初学者程序在OJ上提交得到的runtime error,最多的原因就是多用了input()。比如要求两个数的和,输入是:
程序这么写:
a = int(input())
b = int(input())
print(a+b)
卒。
十、print的时候乱用逗号
print时用','分开要输出的多项,会导致输出的多项之间出现空格,这可能导致输出不符合题目要求。解决办法是把要输出的多项全部变成字符串,然后用"+"连接,或者用格式控制的那一套办法。
十一、'/'的结果一定是小数,小数参与运算结果就是小数
题目要求输出结果是整数,比如,却输出小数。忘记了除法 / 的结果一定是小数,以及含小数的算式结果一定是小数,就可能导致这个问题。根据实际情况,可以考虑用int(x)或round(x)将小数x转换成整数,就能解决这个问题。
十二、程序输出的大小写和题目要求的不一致
不仔细看题目要求的输出,自己随便乱敲。比如题目要求输出"YES",程序输出的是"Yes",题目要求输出"case 1#",程序输出是"case #1"之类。程序中要输出的固定文字,一定要从题目的样例输出中拷贝粘贴,不要自己敲。据我经验,每次期末上机考试,都会有学生仅仅因为这种问题在一道题上卡很长时间,甚至最后也无法通过,这道题一分不得。有的学生只是捶胸顿足,悔之晚矣,有的就会抱怨考试评分标准不公,甚至社会不公,猜测最严重者可造成一生的心理阴影。
十三、各种runtimeerror:
runtime error原因排行榜:
- 多用了input()
- 做了不合法的转换。如x为"a12"或""时做int(x),或x为"abc"时做float(x)。
- 字符串或者列表下标越界
- 将字符串与数值相加
最后说一个错误,是老师和教科书常犯的了,虽然基本不影响写程序,但是如果被好事的学生指出来,未免有点尴尬。那就是所谓”多行注释“的提法,说什么用三个单引号括起来的,就是多行注释,比如:
a=a+b
'''
这里是多行注释
真的很多行
'''
print(a)
"那这个岂不也是注释"
print(b)
那玩意是字符串好吧,不是什么注释。当然你要像上面那样写个没用的字符串当注释用,几乎也不影响什么。只不过那样的话,像第7行,字符串就都是注释了,成何体统。下面的程序可以证明三引号括起来的东西不是注释:
if a == 0:
''' 这个是注释吗?
我看不是的
'''
print(a)
如果把上面那行所谓的注释的缩进搞得和print语句不对齐,马上就会报错。哪有注释还要求缩进对齐的?且在Pycharm里面,它是字符串的绿色,而不是注释的灰色。
另外再多一句嘴,不是关于bug的,而是关于码德码风的:严禁在程序里面使用脏字!人家写个函数名字叫做 solve(),偏有人写个函数要叫 f**k(),变量名f**k1,f**k2.....。虽然个别,但不是孤例。十几年前我就碰到,现在还能碰到。大概他们觉得程序交到OJ没人看吧,说不定反倒还要怪我偷窥了。须知天道昭昭,人前人后一个样,才是一个正直的程序员。
最后进个广告,我在中国大学MOOC上开了非常不专业的Python课,“实用Python程序设计",实用,实用啊!所谓不专业,当然不是我不专业,而是强调专门面向非计算机专业的同学,欢迎学习!
谢谢阅读!