• Python之程序调试



    一、前言

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


    二、使用自动的IDLE进行程序调试

      多数的集成工具都提供了程序调试功能。例如,我们一直在使用的IDLE,也提供了程序调试功能。使用IDLE进行程序调试的基本步骤如下:
      (1)打开IDLE(Python Shell),在主菜单上选择Debug-》Debugger菜单选项,将打开Debug Control对话框(此时该对话框是空白的),同时Python3.10.7 Shell窗口中将显示“[DEBUG ON]”(表示已经处于调试状态),如图所示:

    在这里插入图片描述

      (2)在Python3.10.7 Shell窗口中,选择File-》Open菜单项,打开要调试的文件,然后添加需要的断点

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

      添加断点的方法是:在想要添加断点的代码行上,单击鼠标右键,在弹出的快捷菜单中选择“Set Breakpoint”菜单项。添加断点的行将以黄色底纹标记,如图所示:
    在这里插入图片描述

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

      (3)添加所需的断点(添加断点的原则是:程序执行到这个位置时,想要查看某些变量的值,就在这个位置添加一个断点)后,按下快捷键,执行程序,这时Debug Control 对话框中将显示程序的执行信息,勾选Globals复选框,将显示全局变量。此时的Debug Control对话框如图所示:

    在这里插入图片描述
      (4)在上图所示的调试工具栏中,提供了5个工具按钮。这里单击Go按钮执行程序,直到所设置的第一个断点。由于在实例代码.py文件中,第一个断点需要获取用户的输入,所以需要先在Python3.10.7 Shell窗口中输入除数和被除数。输入后,Debug Control窗口中的数据将发生变化,如下所示:

    在这里插入图片描述

    说明 :在调试工具栏中的5个按钮的作用为:Go按钮用于执行跳至断点操作;Step按钮用于进入要执行的函数;Over按钮表示单步执行;Out按钮表示跳出所在函数;Quit按钮表示结束调试。

    多学两招 :在调试过程中,如果所设置的断点处有其他函数调用,还可以单击Step按钮进入到函数内,当确定该函数没有问题时,可以单击Out按钮跳出该函数。或者在调试的过程中已经发现的问题的原因,需要进行修改时,可以直接单击Quit按钮结束调试。另外,如果调试的目的不是很明确(即不确认问题的位置),也可以直接单击Setp按钮进行单步执行,这样可以清晰地观察地观察程序的执行过程和数据的变量,方便找出问题。

      (5)继续单击Go按钮,将执行到下一个断点,查看变量的变化,直到全部断点都执行完毕。调试工具栏上的按钮将变为不可用状态,如图所示:

    在这里插入图片描述

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


    三、使用assert 语句调试程序

      在程序开发过程中,除了使用开发工具自带的调试工具进行调试外,还可以在代码中通过print()函数把可能出现问题的变量输出进行查看,但是这种方法会产生很多垃圾信息。所以调试之后还需要将其删除,比较麻烦。所示,Python还提供了另外的方法,使用assert语句调试。

      assert的中文意思是断言,它一般用于对程序某个时刻必须满足的条件进行验证。assert语句的基本语法如下:

    assert expression [,reason]
    
    • 1

    参数说明:

    • expression:条件表达式,如果该表达式的值为True时,什么都不做;如果为False时,则抛出 AssertionError 异常。
    • reason:可选参数,用于对判断条件进行描述,为了以后更好地知道哪里出现了问题。

      例如,在执行除法运算的division()函数中,使用assert 断言调试程序,代码如下:

    def division():
        num1 = int(input("请输入被除数:"))  # 用户输入提示,并记录
        num2 = int(input("请输入除数:"))
        assert num2 != 0, "除数不能为0"
        result = num1 // num2  # 执行除法运算
        print(result)
    
    
    if __name__ == "__main__":
        division()  # 调用函数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

      运行程序,输入除数0,将抛出如下图所示的AssertionError 异常。

    在这里插入图片描述

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

    def division():
        num1 = int(input("请输入被除数:"))  # 用户输入提示,并记录
        num2 = int(input("请输入除数:"))
        assert num2 != 0, "除数不能为0"
        result = num1 // num2  # 执行除法运算
        print(result)
    
    
    if __name__ == "__main__":
        try:  # 捕获异常
            division()  # 调用函数
        except AssertionError as e:  # 处理AssertionError异常
            print("\n输入有误", e)  # 输出错误原因
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

      assert语句只在调试阶段有效。我们可以通过在执行Python命令时加入-O(大写)参数来关闭assert 语句 。例如,在命令行窗户中输入以下代码执行“E:\program\Python\Code”目标下的Demo.py文件,即关闭Demo.py文件中的assert语句:

    E:
    cd E:\program\Python\Code
    Python -O Demo.py
    
    • 1
    • 2
    • 3

  • 相关阅读:
    学生党蓝牙耳机怎么选?适合realme手机的高端蓝牙耳机推荐
    什么是 内网穿透
    Leetcode P640
    【Kubernetes】基于K8S & SpringCloud OpenFeign的一种微服务构建模式
    Ubuntu系统安装Nvidia驱动后重启黑屏
    Vue中如何获取dom元素?
    GANs的优化函数与完整损失函数计算
    java毕业设计车位管理系统Mybatis+系统+数据库+调试部署
    算法分析与设计课后练习21
    pdf相关的python库
  • 原文地址:https://blog.csdn.net/weixin_45191386/article/details/126795873