如果你想成为一个伟大的程序员, 让我们来谈谈一个非常重要的话题, 那就是调试｡
没有人能写出完美的程序｡
真的不可能｡
我们总是会犯错误, 程序也在不断改进｡
当我们发现越来越多的错误时, 我们不断地改进我们的代码, 因为程序在代码运行时充满了错误,
或者我们称之为bug或异常｡
你看, 从我们的代码中找到并删除这些bug或错误的行为被称为调试｡
作为程序员, 我们大部分时间都在调试代码, 不管是我们自己的代码还是其他人的代码, 然后弄清楚, 嘿,
为什么这不起作用？
而且高级开发人员非常非常擅长调试｡
在这段视频中, 我们来谈谈我对调试的一些建议, 以及一些好的做法｡
现在, 请记住, 随着您编写代码的次数越来越多, 调试代码的能力也会越来越强｡
所以你能做的最好的事情就是继续练习, 继续写Python代码｡
我有什么建议？
首先, 你肯定想用一些贷款｡
什么是借贷？
我们在设置开发人员环境时就已经讨论过了｡
借出允许我们在编写代码时检测代码中的一些问题｡
例如, 如果我在这里输入num加4, 我会得到一个红色下划线, 你会看到, 在我运行代码之前, Pi
Flakes贷方就注意到了, 嘿, 有一个未定义的NUM｡
因此, 借贷可以让我们在运行代码之前就发现这些错误｡
我们看到我们可以使用像pi charm这样的ID, 它已经内置了借贷功能, 或者使用sublime text或Visual
Studio代码, 并安装像PI lent这样的包和扩展, 以便在我们的代码中真正拥有借贷功能｡
这是非常非常重要的工具｡
接下来, 我建议始终使用某种ID或｡
艾德, 因为这些编辑器和ID, 特别是那些特定于Python的, 比如Pi char,
有所有这些内置的工具供我们使用, 比如基于Pep 8的自动格式化｡
还记得Python社区的官方风格指南吗？
它允许我们检测代码中的错误, 比如说, 突出显示和格式化代码｡
因此, 在运行代码之前, 我们就可以很容易地检测到任何错误｡
最后, 您希望能够学习阅读错误｡
这是我试着和你们一起练习的东西, 正如我们所学到的, Python｡
例如, 如果我做四加, 我们在这里说胡言乱语, 然后我单击“运行”｡
马上就去
我明白了｡
嘿, 六号线｡
我的主PI文件有错误｡
有一个类型错误, 我在这里看到我试图添加int和一个字符串｡
所以我们能够读取错误并理解它们的含义｡
也许我会这样做｡
如果我单击“运行”｡
出现语法错误｡
而我知道的一个语法错误意味着｡
嘿, Python解释器试图读取我的代码, 但你刚才写的不是Python｡
我不知道你在做什么｡
给你
在扫描字符串文字时, 我看到它已到达行尾｡
所以我试着读这个字符串突然程序结束了就像你应该结束这个字符串一样, 记得吗？
因此, 能够读取这些错误是非常非常重要的｡
我们在这门课中讨论过其中的一些, 一些最常见的错误, 比如语法错误, 你写的东西,
Python解释器无法理解｡
我们有名字错误之类的东西, 对吧？
我们使用了一个不存在的变量｡
所以Python不理解｡
嘿, 我不知道名字是什么｡
名字有什么价值？
我们有空气类型
这就是我们不匹配数据类型的时候, 比如说一个字符串加四个｡
我们有价值错误｡
我们会遇到类似键错误的情况, 我们试图访问一个不存在的键, 或者属性错误,
我们试图访问一个对象的方法, 但该方法不存在｡
这些错误是我们在整个课程中经常看到的, 我们还会看到更多｡
我想说的是, 大约有15到20个错误是真的, 真的很常见, 显示了90%的时间｡
如果你记得的话, 你可以随时去Python文档中学习它们｡
但这只是练习的结果｡
如果您看到一个以前从未见过的错误, 我建议您在看到该错误后立即查看文档并阅读｡
你通常会记得下一个问题｡
但是让我向您展示我最喜欢的调试代码的方法｡
它被称为PDB或Python调试器｡
PDB是Python中的内置模块｡
再来一次｡
请记住, 我们的内置模块是Python自带的标准库的一部分, PDB是用于交互式解释器的Python调试器｡
你可以在这里读到它, 但让我告诉你它是做什么的｡
你看, 我是说...
PDB非常有用, 因为它允许我们与代码进行交互｡
所以之前我们有一个函数, 比如说我们有ADD函数, 我们有num1, num2,
然后这个函数简单地返回num1加上num2｡
在此之前, 如果我们想调试这段代码, 假设我们添加了四个, 再加上一些乱码, 它会给我们一个错误｡
第一步, 我会采取的最有可能是添加一个打印在这里, 所以我可以说打印｡
嘿, 这是怎么回事？
让我看看, 我不知道
一号和二号, 以及它给我的｡
而打印是调试代码的一种非常非常快速和简单的方法｡
我一直在用它, 但PDB给了我们一点额外的提升｡
所以我们可以这样使用它｡
我们只需导入PDB, 而不是使用类似print函数的东西, 我们可以简单地说, 让我在这里添加一个空格｡
对于Python调试器, 我们可以简单地说PDB, 然后说set trace｡
我认为set trace是导入的PDB对象上最有用的方法｡
当我运行set方法时, 你会看到｡
它现在给了我一个交互式的Python调试器, 我现在可以在这里输入命令, 并实际测试我的代码｡
这是PDB中有趣的部分, 我就在第八行内｡
因此, 我的代码试图运行, 但当它说PDB设置跟踪时, 它就暂停了｡
现在我在这个世界上, 我可以测试出发生了什么, 这样我就可以说, 嘿, 第一个, 这是什么？
嗯, 一号是四号｡
二号怎么样？
数字2是一个字符串, 我可以这样, 我试图把一个字符串和一个整型加起来, 这不起作用,
所以我也可以用这种方法检测错误｡
现在这个PDB互动实际上有很多有用的东西｡
所以如果我在这里输入help｡
你看到了吗？
我有可以在PDB中使用的命令｡
所以我这里有一吨｡
我有exit, 我假设它会把我从这个PDB, Python调试器中退出｡
但我也有｡
事情就像｡
比如说列表｡
让我们看看list的作用｡
所以当我在这里输入列表的时候, 现在这个网站真的是｡
没有显示太多, 但希望您仍然可以看到列表｡
我猜是某种输出｡
我看到我得到了一个代码和OC的列表, 但是假设我不知道列表中什么做得好｡
PDB允许我们键入, 帮助, 然后列出｡
当我们这样做的时候, 它实际上给了我们文档, 就像我们这里一样｡
如果我们去, 比方说, 列表｡
让我想想｡
列表, 列表, 列表, 列表
就在这里｡
它给我的文件就在这里｡
所以它说列出当前文件的源代码｡
好吧, 我会的
所以它只列出了我们写的源代码｡
好吧, 这很酷｡
还有什么？
嗯, 我们也有类似step或se的简称, step真的很酷｡
让我们用clear把它放到顶部｡
我将输入clear, 这样它将清除所有中断｡
咱们干吧｡
让我们把它放大一点, 这样你就能看到了｡
你去那里｡
这样好多了
好吧, 我会的
现在我可以执行类似step这样的操作, step将允许我们转到下一行｡
所以, 如果我们再把它放大一点｡
Step会说, 嘿, 去第九行｡
让我们看看会发生什么｡
我将按步骤键入｡
哦, 我的天
我还跳了两步｡
那我们就向右走一步｡
看看这个｡
我转到代码中的下一行, 它就会找到我｡
嘿, 你打错了吗？
错误｡
我们得到的错误｡
我们在这里再加一行｡
假设我们要把4加5或者4乘以5, 然后赋值给一个变量.
如果我停下来再运行一次｡
我现在在里面
在这里｡
如果我输入茶, 我会得到一个名字｡
空气｡
茶之所以没有定义, 是因为｡
我在第八行的代码里, 但我们还没运行第九行｡
那么我们来做一步｡
现在我站在另一边｡
所以如果我现在做pt, 我得到t等于20｡
太棒了｡
所以我可以逐步执行代码, 这非常非常有用｡
我还有continue这样的功能, 它允许我继续执行代码, 直到返回一些东西, 然后继续并退出PDB,
看看它｡
我得到了错误｡
我们再来一遍｡
另一个有用的命令是a, a实际上给了我当前函数的所有参数.
看看这个｡
我得到了所有的论点, 这也是非常有用的｡
还有命令w｡
它向我显示了它正在执行的当前行的上下文｡
所以你可以看到我们在哪里, 我们在广告中｡
功能｡
我们用这些参数调用了它, 现在我们要运行这一行｡
最后, 当我们调试这个的时候｡
好吧, 我想我终于看到我们有一个错误｡
我们应该给它一个数字, 这样我就可以退出这里, 简单地把它固定为5｡
所以现在我可以删除PDB和所有内容｡
我的代码应该能正常工作｡
太棒了｡
因此, PTB是真棒, 通过您的代码和调试步骤, 并尝试不同的东西｡
它确实需要一些练习, 但是在玩了一天PDB之后, 您将变得非常非常擅长调试｡
看完这段视频后, 我建议你写PDB,
希望你有一个足够大的Python文件, 你可以使用help和list来尝试不同的命令, 看看你有什么可用的｡
实际上, 我想给你看最后一样东西｡
假设我们返回到代码, 即PDB集合跟踪｡
我单击“运行”｡
我可以这样做吗, 我注意到我输入了A, 我有｡
好的, 我的代码可以工作了, 但是我能把数字2改成等于一些乱码吗？
好吧, 让我们看看我是否做下一个现在｡
让我们接着运行最后一行｡
我呼吸新鲜空气｡
所以我也可以在这里修改变量, 写Python代码来测试我的函数｡
这一点现在起作用了｡
我可以测试一下, 如果我们把这个变量改成另一个值会发生什么？
同样, 非常非常有用｡