为什么要调试?
我们发现程序运行的结果和我们预期的不符。
程序运行的错误,我们通常叫做bug。
有两种类型的bug:语句错误和逻辑错误。
所谓语句错误,就是执行代码的时候,解释器就可以直接发现的代码错误,他没有办法继续执行,直接就会报错。
还有一种情况就是:
解释器并不报错,只是运行的结果和我们预期的不一样。那这种就是逻辑错误。
遇到逻辑错误,最有效的方法就是调试程序。
所谓的调试程序,检查程序运行过程中的一些关键步骤里的变量,看看是否正确。从而判断出是哪里代码的问题。
调试程序的方法:
IDE断点调试方法:
最常用的方法使用IDE的调试功能,在关键代码处设置断点。查看关键变量的值。
什么是设置断点:
设置断点,设置某些代码行位置,当程序运行到这些位置,就会暂停执行。
我们在程序运行过程中,查看某些变量的值,必须要让运行的程序能停在相应的位置。
说明:不要选run,run就是直接运行程序,不会停留在断点处。应该是选择debug。
程序已debug模式运行了,并且会停留在刚刚设置的断点处。
content变量还没有赋值,因为这条语句还没有执行。此处高亮行代码尚未被执行。
step over:IDE就会让当前的程序执行当前行的代码。如果该行代码里有函数调用,执行不会暂停在函数里面,而是执行运行完所有的函数里面的代码,暂停在下一行代码。
也就是单步执行。
step into:IDE就会让当前的程序执行一步当前的代码。如果该代码里有函数调用,执行就会暂停在函数里面。
这个按钮是resume program,这个是程序停留到下一个程序断点处。
print出关键变量的值:
如果没有继承开发环境IDE,可以在代码中增加很多代码打印语句。
- import requests
-
- # 用requests获取销量信息
- res = requests.get('https://cdn2.byhy.net/files/py/0016_price')
- content = res.content.decode('utf8')
- print(f'得到的字符串内容:{content}')
-
- # 下面两个变量记录当前找到的销量最多的手机和卖出数量
- # 初始值都是None
- mostsoldphone = None
- mostsoldcount = None
-
- for info in content.splitlines():
- info = info.strip()
- # 去掉空行
- if not info:
- continue
-
- items = info.split(',')
- # 销量在倒数第二列,获取销量信息
- soldcount = int(items[-2])
- # 型号在 第一列, 获取型号信息
- phonetype = items[0]
-
- # 如果前面已经有销量最多的手机记录,和当前这款手机销量比较
- if mostsoldphone:
- # 如果当前这款手机销量更高,把它置为最热卖手机
- print(f'mostsoldcount的值:{mostsoldcount}')
- print(f'soldcount: {soldcount}')
- print(f'程序判断: {mostsoldcount} < {soldcount}')
- if mostsoldcount < soldcount:
- # print(f'程序判断: {mostsoldcount} < {soldcount}')
- mostsoldcount = soldcount
- mostsoldphone = phonetype
-
- # 如果前面没有有销量最多的手机记录,说明这是第一条记录
- # 暂时先把它置为最热卖手机
- else:
- mostsoldcount = soldcount
- mostsoldphone = phonetype
-
- print(f'最热卖手机是 {mostsoldphone}, 销量是 {mostsoldcount}')
执行结果是这个地方出现问题。是这个地方出现问题。估计是类型这块出现问题。