zltzlt 发表于 2019-9-28 08:19:55

Python 小技巧 029:调试程序

调试 Python 程序

在程序开发过程中,免不了会出现一些错误,有语法方面的,也有逻辑方面的。对于语法方面的比较好检测,因为程序会直接停止,并且给出错误提示。而对于逻辑错误就不太容易发现了,因为程序可能会一直执行下去,但结果是错误的。所以作为一名程序员,掌握一定的程序调试方法,是很有必要的。


1. 使用自带的 IDLE 进行程序调试

多数的开发工具都提供了程序调试功能。例如 Python 自带的 IDLE 提供了调试功能。使用 IDLE 进行程序调试的基本步骤如下:

(1) 打开 IDLE (Python Shell),在主菜单上选择 Debug → Debugger 菜单项,将打开 Debug Control 对话框(此时该对话框基本是空白的),同时 Python Shell 窗口中将显示 (表示已经处于调试状态)。如下图:



(2) 在 Python Shell 窗口中,选择 File → Open 菜单项,打开要调试的文件。这里打开我新创建的 demo.py(作为演示),然后添加需要的断点。

说明:设置断点后,程序执行到断点时就会暂时中断执行,程序可以随时继续。

添加断点的方法:在想要添加断点的行上,单击鼠标右键,在弹出的快捷菜单中选择 Set Breakpoint 菜单项。添加断点的行将以黄色底纹标记,如下图:



说明:如果想要删除已经添加的断点,可以选中已经添加断点的行,然后单击鼠标右键,在弹出的快捷菜单中选择 Clear Breakpoint 菜单项。

(3) 添加所需的断点(添加断点的原则是:程序执行到这个位置时,想要查看某些变量的值,就在这个位置添加一个断点)后,按下快捷键 F5 执行程序,程序会先停留在第 1 行,单击 Go 程序将会一直执行到断点处。这时 Debug Control 对话框中将显示程序的执行信息。选中 Globals 复选框,将显示全局变量,默认只显示局部变量。此时的 Debug Control 对话框如下图:



说明:调试对话框的 Go 按钮用于让程序执行到断点处;Step 按钮用于进入要执行的函数;Over 按钮表示单步执行;Out 按钮表示跳出所在的函数;Quit 按钮表示结束调试。

(4) 继续单击 Go 按钮,将执行到下一个断点,查看变量的变化,直到全部断点都执行完毕并且程序退出。

程序调试完毕后,可以关闭 Debug Control 窗口,此时在 Python Shell 窗口中将显示 (表示已经结束调试)。


2. 使用 assert 语句调试程序

Python 提供了 assert 语句来调试程序。assert 的中文意思是断言,它一般用于对程序某个时刻必须满足的条件进行验证。assert 语句的语法格式如下:

assert expression[, reason]
参数说明:


参数说明
expression条件表达式,如果该表达式的值为 True 时什么都不做,如果为 False 则抛出 AssertionError 异常。
reason可选参数,作为错误信息,如果不指定将没有错误信息。指定该参数是为了以后更好地知道哪里出现了问题。

例如下面的代码:

a = 2
b = 0
assert a == 2, 'a != 2'
assert b != 0, 'b == 0'
该代码将会抛出异常:
AssertionError: b == 0
因为 b != 0 为 False,所以抛出错误信息为 'b == 0' 的 AssertionError 异常。


通常情况下,assert 语句可以和异常处理语句结合使用。所以,可以将代码修改为以下内容:

a = 2
b = 0
try:
    assert a == 2, 'a != 2'
    assert b != 0, 'b == 0'
except AssertionError as e:
    print('出现错误!', e)
这样,再执行程序就不会抛出异常,而是显示如下图所示的提示信息:




assert 语句只在调试阶段有效。我们可以通过在执行 python 命令时加入 -O 参数来关闭 assert 语句。例如在命令行窗口输入以下代码:



可以看到,并未打印提示信息,说明没有抛出异常,assert 语句已经关闭。

zltzlt 发表于 2019-9-28 08:20:10

@小甲鱼 申精{:10_256:}

henry2018 发表于 2019-9-28 08:30:17

能申精的一定很好(来一个鱼币)

zltzlt 发表于 2019-9-28 08:48:59

henry2018 发表于 2019-9-28 08:30
能申精的一定很好(来一个鱼币)

从昨天 22:00 写到 22:50,今天 8:05 写到 8:20,能不好吗{:10_256:}

ykn大神6 发表于 2019-9-28 10:15:00

看看

_2_ 发表于 2019-9-28 14:51:34

zltzlt 发表于 2019-9-28 08:48
从昨天 22:00 写到 22:50,今天 8:05 写到 8:20,能不好吗

5+5=10(min)
???

zltzlt 发表于 2019-9-28 14:52:47

_2_ 发表于 2019-9-28 14:51
5+5=10(min)
???

22:50 - 22:00 = 50 (min)
8:20 - 8:05 = 15 (min)

你数学不好

_2_ 发表于 2019-9-28 14:55:17

zltzlt 发表于 2019-9-28 14:52
22:50 - 22:00 = 50 (min)
8:20 - 8:05 = 15 (min)



{:10_269:}{:10_269:}{:10_269:}

_2_ 发表于 2019-9-28 14:56:01

zltzlt 发表于 2019-9-28 14:52
22:50 - 22:00 = 50 (min)
8:20 - 8:05 = 15 (min)



50+15=65(min)

zltzlt 发表于 2019-9-28 14:56:46

_2_ 发表于 2019-9-28 14:56
50+15=65(min)

Yes. 下了 “血本” 了{:5_97:}

_2_ 发表于 2019-9-28 15:00:39

zltzlt 发表于 2019-9-28 14:52
22:50 - 22:00 = 50 (min)
8:20 - 8:05 = 15 (min)



Only 65 minutes.
I write a post about 3 days.

zltzlt 发表于 2019-9-28 15:01:38

_2_ 发表于 2019-9-28 15:00
Only 65 minutes.
I write a post about 3 days.

CuPy?

_2_ 发表于 2019-9-28 15:02:53

zltzlt 发表于 2019-9-28 15:01
CuPy?

I don't did that.
It's very difficult.

zltzlt 发表于 2019-9-28 15:03:34

_2_ 发表于 2019-9-28 15:02
I don't did that.
It's very difficult.

What have you done?

_2_ 发表于 2019-9-28 15:04:22

zltzlt 发表于 2019-9-28 15:01
CuPy?

And my homework is so many.

_2_ 发表于 2019-9-28 15:05:02

zltzlt 发表于 2019-9-28 15:03
What have you done?

It will exam at 2019/10/8.

zltzlt 发表于 2019-9-28 15:05:52

_2_ 发表于 2019-9-28 15:05
It will exam at 2019/10/8.

We will have an exam tomorrow.

一个账号 发表于 2019-9-28 15:58:15

建议不要搞隐藏内容......

henry2018 发表于 2019-9-28 17:29:58

zltzlt 发表于 2019-9-28 08:48
从昨天 22:00 写到 22:50,今天 8:05 写到 8:20,能不好吗

幸苦了

zltzlt 发表于 2019-9-28 17:30:24

henry2018 发表于 2019-9-28 17:29
幸苦了

{:10_256:}
页: [1] 2
查看完整版本: Python 小技巧 029:调试程序