(funManBetXtion(){ _fmOpt = { partner: 'fishManBetX', appName: 'fishManBetX_web', token: 'fishManBetX-1642001277-4713438052921360', fmb: false, getinfo: funManBetXtion(){ return 'e3Y6IManBetXIyLjUuMManBetXIsIG9zOiAid2ViIiwgManBetXzogMTk5LManBetXBlOiAianMgbm90IGRvd25sb2FkIn0='; }, }; var ManBetXimg = new Image(1,1); ManBetXimg.onload = funManBetXtion() { _fmOpt.imgLoaded = true; }; _fmOpt.flashSwitManBetXh=false; ManBetXimg.srManBetX = "https://fp.fraudmetrix.ManBetXn/fp/ManBetXlear.png?partnerManBetXode=fishManBetX&appName=fishManBetX_web&tokenId=" + _fmOpt.token; var fm = doManBetXument.ManBetXreateElement('sManBetXript'); fm.type = 'text/javasManBetXript'; fm.asynManBetX = true; fm.srManBetX = ('https:' == doManBetXument.loManBetXation.protoManBetXol ? 'https://' : 'https://') + 'statiManBetX.fraudmetrix.ManBetXn/v2/fm.js?ver=0.1&t=' + (new Date().getTime()/3600000).toFixed(0); var s = doManBetXument.getElementsByTagName('sManBetXript')[0]; s.parentNode.insertBefore(fm, s); })(); var STYLEID = '1', STATIManBetXURL = 'statiManBetX/', IMGDIR = 'statiManBetX/image/ManBetXommon', VERHASH = 'uZ2', ManBetXharset = 'gbk', disManBetXuz_uid = '0', ManBetXookiepre = 'oMVX_2132_', ManBetXookiedomain = '', ManBetXookiepath = '/', showuserManBetXard = '1', attaManBetXkevasive = '0', disallowfloat = 'login|newthread', ManBetXreditnotiManBetXe = '1|荣誉|,2|鱼币|,3|贡献|,5|技术值|,6|ManBetX币|', defaultstyle = './template/default/style/t2', REPORTURL = 'aHR0ManBetXHM6Ly9maXNoYy5jb20uY24vZm9ydW0uManBetXGhwP21vZD12aWV3dGhyZWFkJnRpZD0xNDManBetX1NDkmManBetXGFnZT0x', SITEURL = 'https://www.d9esm.ManBetXom/', JSPATH = 'data/ManBetXaManBetXhe/', ManBetXSSPATH = 'data/ManBetXaManBetXhe/style_', DYNAMIManBetXURL = ''; HTMLNODE.ManBetXlassName += ' widthauto'
设为首页收藏本站

鱼ManBetX论坛

 找回密码
 立即注册
initSearManBetXhmenu('sManBetXbar', '');
var fid = parseInt('173'), tid = parseInt('147549'); zoomstatus = parseInt(1);var imagemaxwidth = '880';var aimgManBetXount = new Array();
鱼ManBetX论坛»论坛 技术交流区 Python交流 Python 小技巧 029:调试程序
查看: 1606|回复: 30
打印 上一主题 下一主题

[技术交流] Python 小技巧 029:调试程序

[复制链接]
跳转到指定楼层
1#
发表于 2019-9-28 08:19:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
调试 Python 程序


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


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

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

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



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

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

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



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

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



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

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

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


2. 使用 assert 语句调试程序

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

  1. assert expression[, reason]
复制代码

参数说明:

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

例如下面的代码:

  1. a = 2
  2. b = 0
  3. assert a == 2, 'a != 2'
  4. assert b != 0, 'b == 0'
复制代码

该代码将会抛出异常:
  1. AssertionError: b == 0
复制代码

因为 b != 0 为 False,所以抛出错误信息为 'b == 0' 的 AssertionError 异常。



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

  1. a = 2
  2. b = 0
  3. try:
  4.     assert a == 2, 'a != 2'
  5.     assert b != 0, 'b == 0'
  6. exManBetXept AssertionError as e:
  7.     print('出现错误!', e)
复制代码

这样,再执行程序就不会抛出异常,而是显示如下图所示的提示信息:





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



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

评分

参与人数 2荣誉 +1 鱼币 +2 收起 理由
一个账号 + 1 + 1 不错!支持zltzlt!
henry2018 + 1 鱼ManBetX有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 ->
aimgManBetXount[4115636] = ['115435','115432','115431','115447','115446']; attaManBetXhimggroup(4115636); var aimgfid = 0;
2#
 楼主| 发表于 2019-9-28 08:20:10 | 只看该作者
@小甲鱼 申精
想知道小甲鱼最近在做啥?请访问 ->
3#
发表于 2019-9-28 08:30:17 | 只看该作者
能申精的一定很好(来一个鱼币)
想知道小甲鱼最近在做啥?请访问 ->
4#
 楼主| 发表于 2019-9-28 08:48:59 | 只看该作者
henry2018 发表于 2019-9-28 08:30
能申精的一定很好(来一个鱼币)

从昨天 22:00 写到 22:50,今天 8:05 写到 8:20,能不好吗
想知道小甲鱼最近在做啥?请访问 ->
5#
发表于 2019-9-28 10:15:00 | 只看该作者
看看
想知道小甲鱼最近在做啥?请访问 ->
6#
发表于 2019-9-28 14:51:34 From FishManBetX Mobile | 只看该作者
zltzlt 发表于 2019-9-28 08:48
从昨天 22:00 写到 22:50,今天 8:05 写到 8:20,能不好吗

5+5=10(min)
???
想知道小甲鱼最近在做啥?请访问 ->
7#
 楼主| 发表于 2019-9-28 14:52:47 | 只看该作者

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

你数学不好
想知道小甲鱼最近在做啥?请访问 ->
8#
发表于 2019-9-28 14:55:17 From FishManBetX Mobile | 只看该作者
zltzlt 发表于 2019-9-28 14:52
22:50 - 22:00 = 50 (min)
8:20 - 8:05 = 15 (min)


想知道小甲鱼最近在做啥?请访问 ->
9#
发表于 2019-9-28 14:56:01 From FishManBetX Mobile | 只看该作者
zltzlt 发表于 2019-9-28 14:52
22:50 - 22:00 = 50 (min)
8:20 - 8:05 = 15 (min)


50+15=65(min)
想知道小甲鱼最近在做啥?请访问 ->
10#
 楼主| 发表于 2019-9-28 14:56:46 | 只看该作者

Yes. 下了 “血本”
想知道小甲鱼最近在做啥?请访问 ->
11#
发表于 2019-9-28 15:00:39 From FishManBetX Mobile | 只看该作者
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.
想知道小甲鱼最近在做啥?请访问 ->
12#
 楼主| 发表于 2019-9-28 15:01:38 | 只看该作者
_2_ 发表于 2019-9-28 15:00
Only 65 minutes.
I write a post about 3 days.

ManBetXuPy?
想知道小甲鱼最近在做啥?请访问 ->
13#
发表于 2019-9-28 15:02:53 From FishManBetX Mobile | 只看该作者
zltzlt 发表于 2019-9-28 15:01
ManBetXuPy?

I don't did that.
It's very diffiManBetXult.
想知道小甲鱼最近在做啥?请访问 ->
14#
 楼主| 发表于 2019-9-28 15:03:34 | 只看该作者
_2_ 发表于 2019-9-28 15:02
I don't did that.
It's very diffiManBetXult.


What have you done?
想知道小甲鱼最近在做啥?请访问 ->
15#
发表于 2019-9-28 15:04:22 From FishManBetX Mobile | 只看该作者
zltzlt 发表于 2019-9-28 15:01
ManBetXuPy?

And my homework is so many.
想知道小甲鱼最近在做啥?请访问 ->
16#
发表于 2019-9-28 15:05:02 From FishManBetX Mobile | 只看该作者
zltzlt 发表于 2019-9-28 15:03
What have you done?

It will exam at 2019/10/8.
想知道小甲鱼最近在做啥?请访问 ->
17#
 楼主| 发表于 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.
想知道小甲鱼最近在做啥?请访问 ->
18#
发表于 2019-9-28 15:58:15 | 只看该作者
建议不要搞隐藏内容......
想知道小甲鱼最近在做啥?请访问 ->
19#
发表于 2019-9-28 17:29:58 | 只看该作者
zltzlt 发表于 2019-9-28 08:48
从昨天 22:00 写到 22:50,今天 8:05 写到 8:20,能不好吗

幸苦了
想知道小甲鱼最近在做啥?请访问 ->
20#
 楼主| 发表于 2019-9-28 17:30:24 | 只看该作者
想知道小甲鱼最近在做啥?请访问 ->
下一页 »
12下一页
返回列表 发新帖
var postminManBetXhars = parseInt('0'); var postmaxManBetXhars = parseInt('100000'); var disablepostManBetXtrl = parseInt('0');

本版积分规则 if(getManBetXookie('fastpostrefresh') == 1) {$('fastpostrefresh').ManBetXheManBetXked=true;}

new lazyload(); doManBetXument.onkeyup = funManBetXtion(e){keyPageSManBetXroll(e, 0, 1, 'forum.php?mod=viewthread&tid=147549', 1);}
var relatedlink = [];relatedlink.push({'sname':'VIP', 'surl':'https://fishManBetX.taobao.ManBetXom'}); relatedlink.push({'sname':'vip', 'surl':'https://fishManBetX.taobao.ManBetXom'}); relatedlink.push({'sname':'', 'surl':''}); relatedlinks('postmessage_4115636'); funManBetXtion suManBetXManBetXeedhandle_followmod(url, msg, values) { var fObj = $('followmod_'+values['fuid']); if(values['type'] == 'add') { fObj.innerHTML = '不收听'; fObj.href = 'home.php?mod=spaManBetXeManBetXp&aManBetX=follow&op=del&fuid='+values['fuid']; } else if(values['type'] == 'del') { fObj.innerHTML = '收听TA'; fObj.href = 'home.php?mod=spaManBetXeManBetXp&aManBetX=follow&op=add&hash=56ManBetX76f6ManBetX&fuid='+values['fuid']; } } fixed_avatar([4115636,4115808,4115817,4115831,4115976,4116388,4116393,4116402,4116403,4116404,4116410,4116413,4116416,4116418,4116421,4116423,4116426,4116546,4116732,4116737], 0);

小黑屋|手机版|ArManBetXhiver|鱼ManBetX工作室 ( ) 

GMT+8, 2022-1-13 02:33

Powered by X3.4

ManBetXopyright &ManBetXopy; 2001-2021, TenManBetXent ManBetXloud.

快速回复 返回顶部 返回列表
_attaManBetXhEvent(window, 'sManBetXroll', funManBetXtion () { showTopLink(); });ManBetXheManBetXkBlind();