原本按照计划,这节课要做一个关于函数的练习,但我希望在拿到题目时,你能够先自己尝试。在编程时你会遇到很多次报错,为了能够更好的排查错误,我临时决定加一节课来讲如何debug。

对于计算机领域里的程序故障,我们叫作bug(臭虫),所以自然也就把排除程序故障叫作debug。下面讲3种debug的方法。

1、看程序提示

程序运行报错时会打印出提示,我们可以根据提示确定bug的位置和错误类型。看下面的代码:

password = input('请输入密码:')
if password = 123:
print('密码正确!')

程序打印结果:

我们可以看到错误类型是【invalid syntax】,代表语法错误。图中第一行最后的【line 25】代表bug出现在代码的第25行(这段代码是从第24行开始写的),【=】下面的小箭头代表bug的位置。看到这里我们很容易得知代码中的【=】应该写成【==】。

修改代码后再次运行,打印结果是:

错误依旧发生在第25行,bug出现在冒号位置。错误提示是【invalid character in identifier】,意思是标识符中的字符无效,即使用了python不能识别的字符。仔细看这个冒号,发现是中文的冒号。

修改成英文冒号运行代码,程序正常运行。

通过看程序提示,能够轻易找出一些常见的错误。它们大多是因为粗心导致的,也是新手很容易犯的。如下:if语句、循环语句、函数末尾缺少冒号

把英文符号写成中文符号

没有缩进或不该缩进时缩进了

【==】和【=】混用

不同类型的数据不能拼接在一起

2、上网搜索

在前面的课程中,我们已经多次提到要利用网络资源来解决编程中的问题。比如第6课中的通过百度得知input()函数返回的数据类型是字符串。在此不再赘述。

在python的学习中,这个方式帮我解决了很多问题,也让我学到了很多课程中不会讲到的知识点。所以,一定要利用好网络资源,毕竟任何书和课程都不可能包含所有的知识点。

就像书和课程不能包含所有的知识点一样,你遇到的每一个bug也不一定都能在网上找到答案。因此,我们还需要学会自行排查。

3、自行排查

在程序运行中,有些bug会通过程序提示报出,而有时虽然程序不会报错,但结果却并非我们期望的。这时候,我们需要通过print()函数和【#】来排查错误。

print()函数的作用是打印出关键步骤的运行结果,看是否与我们期望的结果一致。【#】起注释作用,且python不会执行注释的代码,将可能有bug的代码注释掉,看程序能否正常运行。

下面用一个案例来说明print()函数和【#】是如何运用的。

我平时喜欢吃快餐麦当劳、肯德基和汉堡王,他们中很多餐品的名称很接近,难以判断是哪家的。这里有一份店名和餐品名的对应表,要求输入餐品名后能打印出是哪家店的产品。代码如下:

menu = {
'麦当劳':['麦辣鸡腿汉堡','板烧鸡腿堡','麦乐鸡'],
'肯德基':['香辣鸡腿堡','新奥尔良烤鸡腿堡','吮指原味鸡'],
'汉堡王':['霸辣鸡腿堡','香脆鳕鱼堡','王道嫩香鸡块']
}
food = input('请输入餐品名称:')
for i in menu:
eatery = [i]
if food in eatery:
print(food+'是'+i+'的餐品')

程序运行后发现,虽然没有报错,但是并没有像我们预想的那样输出结果。因此需要对代码进行排查。

检查前8行代码,没有发现问题,那么问题一定出在for循环内部。先将最后两行代码用【#】注销,然后用print()函数打印出变量eatery的值。代码如下:

for i in menu:
eatery = [i]
print(eatery)
#if food in eatery:
# print(food+'是'+i+'的餐品')

运行代码结果为:

请输入食品名称:麦辣鸡腿汉堡

['麦当劳']

['肯德基']

['汉堡王']

我们发现打印的结果是店名,而我们想要的是餐品列表,这样才能用if语句判断输入的餐品是否在餐品列表中。

检查【eatery = [i]】语句,发现这句话是把餐馆名传给变量eatery。要想传递餐品列表,需要把代码改为【eatery = menu[i]】,这样才能取到字典中键对应的值,也就是餐厅对应的餐品列表。

因此,最终的代码为:

menu = {
'麦当劳':['麦辣鸡腿汉堡','板烧鸡腿堡','麦乐鸡'],
'肯德基':['香辣鸡腿堡','新奥尔良烤鸡腿堡','吮指原味鸡'],
'汉堡王':['霸辣鸡腿堡','香脆鳕鱼堡','王道嫩香鸡块']
}
food = input('请输入食品名称:')
for i in menu:
eatery = menu[i]
if food in eatery:
print(food+'是'+i+'的餐品')

今天的课程就到这里,下节课进行函数最后一次的学习。