再说一个好消息:计算机(严格说是编译器或解释器)能够帮助我们发现程序中的很多 错误。

    在计算机行话中,程序中的错误被称为“臭虫”(bug),而发现并改正错误的过程称为排 错(debug,或称调试)。

    程序中的错误大体可分为三种类型:语法错误、运行错误和语义错误。 编程语言和自然语言一样规定了一套语法规则,这些规则定义如何用符号组成形式上正

    显然,乘法运算符需要两个运算数,而上面的表达式中未提供足够的数据,因此导致了语法 错误。Python 解释器很容易发现语法错误,并将错误信息打印出来供程序员参考。

    当程序通过了编译器或解释器的语法检查,就可以运行了。遗憾的是,程序语法正确并 不能保证程序执行成功,因为有很多仅在程序执行时才会出现的错误,这种运行错误也称为 异常(exception)。例如,如果程序中有一条执行除法运算的语句,那么在运行时就有可能发 生除数为 0 的错误,这种错误在编译阶段无法发现,因为除法算式是符合语法的。例如:

    上面这个函数显然没有任何语法错误,因此能够被 Python 执行,我们也看到了部分执行 结果:10 / 2 = 5 被正确地计算并显示出来。但是当 x 变为 0,再次计算 10 / x 时发生了运行 错误 ZeroDivisionError。

    程序的执行没有产生任何错误,但结果根本不是圆的面积。

    由于得不到 Python 解释器的帮助,查找语义错误往往是非常恼人的。一般来说我们需要 从头到尾仔细审查程序算法,找出可能的错误步骤。一种有用的排错方法是在程序中插入大 量的 print 语句,用来显示计算的中间结果。通过检查中间结果,可以将错误进行精确定位。 这些 print 语句的目的是帮助排错,一旦程序完全正确,再将它们从程序中删除。

    排错是程序设计的最重要技能之一。找出程序中的错误一方面很令人头痛,另一方面也 很有乐趣,因为排错过程有点像侦探破案的过程——寻找线索、推断原因、最终定位错误。 如果情况很复杂,对某处代码是否错误不是很肯定,则可以利用试错法来排错:先试着修改 该处代码,然后运行程序看看结果如何。这个过程可以重复进行,直至确定错误为止。