![Python基础编程与实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/763/42637763/b_42637763.jpg)
2.4 程序错误
2.4.1 语法错误
用计算机语言编写程序,就要服从计算机语言的语法要求。如果不满足它的语法要求,计算机就无法识别指令,从而导致执行过程中断,无法得到预想中的结果[3]。语法是指程序中语句的组成规范。刚开始学习编程时会遇到很多语法错误,不要灰心,熟练之后错误就会减少。
常见的语法错误有:遗漏必要的符号、关键字拼写错误、缩进错误和赋值错误等。
1.遗漏符号
Python语言中有一些必要的符号,如果缺少了某个符号,会产生怎样的结果呢?如代码清单2-3所示。
代码清单2-3 遗漏符号错误示例
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_38_03.jpg?sign=1738943047-vTCXuP5l6vICct1XUcONLXdNkfnRMJe2-0-523c30bb22c73ab3e934d51e8b83670a)
运行结果:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_39_01.jpg?sign=1738943047-jk6q7scTaG6RygUtPxTvYebXCMbpxBxj-0-8597c8a76f66f6de19fb6dbed5e64a08)
以2.2.5节中例2-4为例,程序第3行后面缺少冒号时,运行程序过程中就会报错。错误会指定文件的路径、名称、第几行出现了错误和错误类型。此时错误类型为“无效的语法”,即while语句使用错误,正确的语法是while语句后面要加冒号。
2.关键字拼写错误
代码清单2-4举例说明了如果出现关键字拼写错误,程序会怎样运行。
代码清单2-4 关键字拼写错误
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_39_02.jpg?sign=1738943047-6gNfGkkVNFBhFLHYguerPFGzmBG0C15P-0-7aa9dcbc4bc5d4ea1f12788dd420e4e9)
运行结果:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_39_03.jpg?sign=1738943047-r86YumtNy1Ui0btXYLaq8g0rDIljbyIA-0-aab696166a1b52ed53b6f4a5fe4bb31d)
如果例2-4中关键字while拼写错误,程序仍会在第3行报错,错误类型仍是“无效的语法”。由此可见,程序报错只会报错误的一个大类,具体出现了什么问题,还要用户自己仔细查找分析。
3.缩进错误
在Python中,缩进不是随意的,要严格符合规范,如果随意缩进,程序就会报错,如代码清单2-5所示。
代码清单2-5 代码缩进错误示例
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_39_04.jpg?sign=1738943047-kBLX484Z5VKFCDmtOwy5wMcaJuuz1FGM-0-8d0b5d635d52e1f6fd493159cce4889b)
运行结果:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_39_05.jpg?sign=1738943047-qLI4GyfrQbrfWzLxGQn40I1M1a7k6C4k-0-5a9ce03c9b1f87a81639a918df6aeae8)
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_40_01.jpg?sign=1738943047-rIfwYhmy9CTS06j0X0AM76YfM7U2XRWv-0-11eb096349160b6cdb7cac22222ec409)
如果去掉例2-4中while循环体的缩进,程序运行时就会报错,错误提示为“期望一个缩进块”。
4.赋值错误
在写代码时,还要注意“=”的用法,它的含义是将右边的值赋给左边。如:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_40_02.jpg?sign=1738943047-MgM2J1jrgmgMQMCQU6jgcq5pAAQRsWAr-0-f82207ee99ac1c2297a6c0526cdb34f6)
如果将等号左右两边交换位置,则会报错。
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_40_03.jpg?sign=1738943047-0QH5vuXDaWELj8t8VbUpOECLtxkiHnXJ-0-73a415953f65bac310d7749a4ec39468)
2.4.2 运行错误
一些看似没有错误的程序在运行过程中也可能会出现错误,有时称为异常。并且程序规模越大,出现运行错误的概率也就越大[1]。运行错误的种类有很多,如内存用尽、除数为0、打开的文件不存在、使用的模块没有找到等。不过Python中设计了专门的异常处理语句,帮助查找错误类型,降低错误的影响。在第9章中会详细介绍异常处理机制。
下面介绍一个除数为0的例子:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_40_04.jpg?sign=1738943047-yquJFhNZxPCZSM8nIzXAbQMCz7XD9ZqB-0-a30285baa744f596f5b4908e3f9a77c9)
2.4.3 逻辑错误
逻辑错误也称为语义错误,即使程序存在逻辑错误,也能正常运行,不会返回任何报错信息,但是得不到期望的结果。这是因为无意中给了计算机与算法不相符的指令[3]。一般产生逻辑错误的原因是对算法理解不透彻或对语句的运行机制不理解。查找逻辑错误非常困难,要重新梳理算法逻辑,逐步执行指令,以确定是哪一部分出现了错误。
举一个简单的例子:计算a和b的平均值,如代码清单2-6所示。
代码清单2-6 逻辑错误示例
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_40_05.jpg?sign=1738943047-l9tozY7IWHkWh5RgM5ldloonj0w87sUq-0-d7ed20fbdede07a0f285a2fbdd09fdc1)
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_41_01.jpg?sign=1738943047-I3zu160BKrwYG0Bgqb2VRbkqzD3xquO2-0-3425a7503820f716ba20b15d3c64799d)
运行结果:
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_41_02.jpg?sign=1738943047-2Y4Vs5Xx6RGPL0jD9PFCRCCnNAc7liOp-0-b7eb5189eb75fa854efd1b84389291bd)
75288.5显然不是75264和49的平均值,但是程序能够正确运行。此时要注意,程序正确运行不代表得到的结果一定是对的。经过观察可以发现,求平均值的算法出现了错误,应为(a+b)/2。
表2-6总结了Python中常见的错误类型。
表2-6 程序错误类型总结
![](https://epubservercos.yuewen.com/A08F29/22139294909122906/epubprivate/OEBPS/Images/978-7-111-62027-3_41_03.jpg?sign=1738943047-bHrs4wydnhKD6gX9dtaGyM2UwBlbN3MU-0-a26fb32a4d178ad6508ebab6f63d8b38)
由表2-6可知,在程序的三类错误中,语法错误最容易找到,也最容易修正,理解计算机报错的类型和主要表现即可对症下药,改掉错误。其次是运行错误,不过有异常处理机制的帮助,找到错误根源也不算特别难。最令人头疼的是逻辑错误,针对这类错误可以采用单步运行的方法,逐句运行程序,一步步梳理程序逻辑与要实现的算法是否吻合。