你会在编程过程中遇到很多错误 (名为漏洞)。理解这些错误产生的原因,以及解决方法在编程中尤为重要。Python会严格按照你写的代码运行,但如果它理解不了你所写的东西,程序就不会运行。同样的道理,Python会提示你哪个地方会出错,帮助你修正程序。
以下是两种Python错误。
示例:句法错误
print "Gee golly"
在第一个例子中,我们忘了在 print 后面的内容上加上圆括 号,正确形式为 Print (…)。 Python 无法理解这样错误的代码。
这是第二个例子。
示例:运行时错误
print(greeting)
在第二个例子中,我们没有定义 greeting 变量。Python知道你要做什么,但是因为 greeting 没有被定义,所以错误出现了。
当Python不理解程序时,syntax error (句法错 误)会出现。当Python理解程序,但是在运行时出现问题时,run-time error (运行时 错误)会出现。
在英语中,句法错误 就像是说
Please cat dog monkey.
这句话的语法是错的。从英语语法角度讲,缺少一个动词。导致你不知道该做什么。句法与语法相似。
在英语中,运行时错误就像是说
Please eat the piano.
这个句子从语法角度说是对的 - 有动词,有名词,位置也对 - 所以你能理解要做什么。但是,在你执行吃钢琴的这个指令时会出现问题(除非你是一只白蚁)。这个错误叫做运行时错误因为它在这个程序运行后出现。
我们会在结束的时候讨论逻辑错误,逻辑错误是指程序可以正常运行,但是会输出错误的结果。比如说,
Please close the back door so that the bugs don't come in.
如果front door是打开的,这就是一个逻辑错误:漏洞 here should be 虫子
常见的Python语法错误
以下是一些额外的句法错误例子。其中一个很常见的是当Python发现了一个本不该有的符号。
示例:语法错误
print(Hello, World!)
Python会显示SyntaxError: invalid syntax and points with ^ to the exclamation point.原因是 !在Python中无意义。如果我们输入print("Hello, World!"),程序就正确了,因为这时Python就会明白!是Hello, World的一部分文本。
这里还有另一个更加不易察觉 的语句错误。
示例:语法错误
class = "入门高级计算机"
在Python中,class是一个特别的词语。如果你写了course而不是class还好。点击此处来查看Python中所有的特殊“关键词”。
如果你在文本两边只加了一个双引号,或者只用了一个单括号,你会得到以下句法错误:
示例:句法错误缺少第二个双引号
name = "Jim
在这个例子里,EOL是End Of Line的缩写:Python需要另一个"但是这一行内没有。
示例:句法错误缺少第二个括号
print(77
同样,EOF是End Of File的缩写:Python需要)但是程序内没有。
有时看似相近的两个句法错误其实会有不同的错误提示。但不管怎样,错误提示都是为了帮助你改正代码。
运行时错误
以下是一些常见的运行时错误。Python能理解程序指令,但是运行时出了问题。
使用未定义的变量或方程。如果随意篡改大小写,这种错误就会发生:示例未定义变量
callMe = "Maybe"
print(callme)
除以0。数学角度上是错误的。(为什么?因为0乘任何数都是0,所以 1 = X * 0无解,所以 1/0 无意义) 示例除以0
print(1/0)
代码类别不符示例将数字与字母相加
print("you cannot add text and numbers" + 12)
随着我们学习的深入,会有更多的Python句法错误。
从技术角度来看,句法错误和运行时错误有什么区别呢?下面我们一起来比较一下他们。观察每个程序的输出。示例:运行时错误
print("这是一些文字")
print(1/0)
示例:句法错误
print("这是一些文字")
print(1*0
会出现运行时错误的程序会有输出,而出现句法错误的程序不会输出。这是因为Python运行是分两步走的:
Python首先查看程序句法是否正确,以确定其组成成分。
如果句法正确,程序才会被运行。
所以,一个句法错误的程序根本不会运行,但是一个运行时错误的程序会运行,直到错误出现。
逻辑错误
程序也可以成功运行(不出现句法或运行时错误)但是做的事情可能不对。比如,你可能想要一个可以计算两个数平均值的程序:x和y的平均值的定义为
为什么这个程序不对呢?
示例This does notcalculate the average correctly.
x = 3
y = 4
average = x + y / 2
print(average)
平均值应该是
但是程序运行结果是5.0!这次错误是关于算数中“运行顺序”的问题。当你输入x + y / 2的时候,从数学的角度上讲等同于
。修正这个东西,第三行程序应该被写成average = (x + y) / 2,以告诉Python我们真正想要的是
,先进行加法,在进行除法。
逻辑错误出现的原因是错误地设计了程序,或者是因为写的代码表达的意思与设计本意不符(比如平均值这个例子)。逻辑错误很难被发现,尤其是在一个很长的程序中,但随着你编程经验的累计,你会更擅长避开这些逻辑错误。第6D课会给一些帮助你规避这些逻辑错误的建议。
练习
到此为止这一节课的知识就讲解完了,下面是一些有关调试的练习题(修正程序中的漏洞)。你可以试着在程序运行前查找 并修正错误,或者先运行程序 然后通过程序提示来进行修正。
每一个程序都是已经写好的代码。你只需要改几个字符(字母/符号/数字)来修正每个程序。系统拒绝评判更改太多字符的程序。如果想要将程序至原始程序,点击重置程序。
编程练习:夏天请修改以下程序的句法错误,使得打印出从1到10的和。至多可改一个字符。
你需要创建一个账号并登录才能问一个问题。
print(1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 +)
编程练习:你好 Joe请修改以下程序中存在的运行时错误,使得在第一行打印Hello,在第二行打印Joe。至多可改两个字符。
你需要创建一个账号并登录才能问一个问题。
print("Hello")
username = Joe
print(username)
编程练习:购物你打算去买肉和牛奶,但是需要交税。你买了2美金的牛奶和4美金的肉,税率为3%。打印出总额(不需要打印出$)。Hint
你需要创建一个账号并登录才能问一个问题。
meatPrice = 4.00
meatTax = 0.03 * meatPrice
milkPrice = 2.00
milkTax = 0.03 * milkPrice
print(meatTax + meatPrice + milkTax + meatPrice)
当你完成以上练习题后,进入下一课的学习吧!