1E: 错误

你会在编程过程中遇到很多错误 (名为漏洞)。理解这些错误产生的原因,以及解决方法在编程中尤为重要。Python会严格按照你写的代码运行,但如果它理解不了你所写的东西,程序就不会运行。同样的道理,Python会提示你哪个地方会出错,帮助你修正程序。

以下是两种Python错误。

示例: 句法错误

在第一个例子中,我们忘了在 print 后面的内容上加上圆括 号,正确形式为 Print (…)。 Python 无法理解这样错误的代码。
这是第二个例子。

示例: 运行时错误

在第二个例子中,我们没有定义 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发现了一个本不该有的符号。

示例: 语法错误

Python会显示SyntaxError: invalid syntax and points with ^ to the exclamation point.原因是 !在Python中无意义。如果我们输入print("Hello, World!"),程序就正确了,因为这时Python就会明白!Hello, World的一部分文本。

这里还有另一个更加不易察觉 的语句错误。

示例: 语法错误

在Python中,class是一个特别的词语。如果你写了course而不是class还好。点击此处来查看Python中所有的特殊“关键词”。

如果你在文本两边只加了一个双引号,或者只用了一个单括号,你会得到以下句法错误:

示例: 句法错误
缺少第二个双引号

在这个例子里,EOLEnd Of Line的缩写:Python需要另一个"但是这一行内没有。

示例: 句法错误
缺少第二个括号

同样,EOFEnd OFile的缩写:Python需要)但是程序内没有。

有时看似相近的两个句法错误其实会有不同的错误提示。但不管怎样,错误提示都是为了帮助你改正代码。

运行时错误

以下是一些常见的运行时错误。Python能理解程序指令,但是运行时出了问题。

  • 使用未定义的变量或方程。如果随意篡改大小写,这种错误就会发生:
    示例
    未定义变量
  • 除以0。数学角度上是错误的。(为什么?因为0乘任何数都是0,所以 1 = X * 0无解,所以 1/0 无意义)
    示例
    除以0
  • 代码类别不符
    示例
    将数字与字母相加

随着我们学习的深入,会有更多的Python句法错误。

从技术角度来看,句法错误和运行时错误有什么区别呢?下面我们一起来比较一下他们。观察每个程序的输出。
示例: 运行时错误
示例: 句法错误
会出现运行时错误的程序会有输出,而出现句法错误的程序不会输出。这是因为Python运行是分两步走的:

  1. Python首先查看程序句法是否正确,以确定其组成成分。
  2. 如果句法正确,程序才会被运行。

所以,一个句法错误的程序根本不会运行,但是一个运行时错误的程序会运行,直到错误出现。

逻辑错误

程序也可以成功运行(不出现句法或运行时错误)但是做的事情可能不对。比如,你可能想要一个可以计算两个数平均值的程序:xy的平均值的定义为

\displaystyle{\frac{x+y}{2}}

为什么这个程序不对呢?

示例
This does not calculate the average correctly.

平均值应该是

\displaystyle{\frac{x+y}{2}=\frac{3+4}{2}=\frac{7}{2}=3.5}

但是程序运行结果是5.0!这次错误是关于算数中“运行顺序”的问题。当你输入x + y / 2的时候,从数学的角度上讲等同于x + (y / 2) = 3 + (4 / 2) = 3 + 2 = 5。修正这个东西,第三行程序应该被写成average = (x + y) / 2,以告诉Python我们真正想要的是\frac{x+y}{2},先进行加法,在进行除法。
逻辑错误出现的原因是错误地设计了程序,或者是因为写的代码表达的意思与设计本意不符(比如平均值这个例子)。逻辑错误很难被发现,尤其是在一个很长的程序中,但随着你编程经验的累计,你会更擅长避开这些逻辑错误。第6D课会给一些帮助你规避这些逻辑错误的建议。

练习

到此为止这一节课的知识就讲解完了,下面是一些有关调试的练习题(修正程序中的漏洞)。你可以试着在程序运行前查找 并修正错误,或者先运行程序 然后通过程序提示来进行修正。

每一个程序都是已经写好的代码。你只需要改几个字符(字母/符号/数字)来修正每个程序。系统拒绝评判更改太多字符的程序。如果想要将程序至原始程序,点击重置程序

编程练习: 夏天
请修改以下程序的句法错误,使得打印出从1到10的和。至多可改一个字符。

编程练习: 你好 Joe
请修改以下程序中存在的运行时错误,使得在第一行打印Hello,在第二行打印Joe。至多可改两个字符。

编程练习: 购物
你打算去买肉和牛奶,但是需要交税。你买了2美金的牛奶和4美金的肉,税率为3%。打印出总额(不需要打印出$)。Hint

当你完成以上练习题后,进入下一课的学习吧!