**2022年Python学习笔记19**
19-20220203《自学是门手艺》
第11章 第7节 测试驱动开发
第11章 第8节可执行的Python文件
完成朗读:

# 第11章 第7节 测试驱动开发
### 所谓 “算法”
写一个函数,或者写一个程序,其实就是 “实现一个算法” 。
而所谓的 “算法”,Wikipedia 上的定义是这样的:
In mathematics and computer science, an algorithm is an unambiguous specification of how to solve a class of problems. Algorithms can perform calculation, data processing, and automated reasoning tasks.
在数学和计算机科学中,算法是如何解决一类问题的明确说明。算法可以执行计算、数据处理和自动推理任务。
其实,“算法”,就是 “解决问题的步骤” 。
### 试错语句
绝大多数编程语言都有“试错语句”,在 Python 语言中,就有专门用来 “试错” 的流程控制。
当一个程序开始执行的时候,有两种错误可能会导致程序执行失败:
* 语法错误(Syntax Errors)
* 意外(Exceptions)
#### 语法错误(Syntax Errors)
在 Python3 中,如果写 print i,而没有写 print(i),那么犯的是语法错误。
这时,解析器会直接提醒我们在第几行犯了什么样的语法错误。
语法错误存在的时候,程序无法启动执行。
#### 意外(Exceptions)
有时会出现这样的情况:语法上完全正确,但出现了意外。
因为只要没有语法错误,程序就可以启动,所以,这种错误都是在程序已经执行之后才发生的(Runtime Errors)。
比如,写的是 print(11/0),虽然这个语句本身没有语法错误,但这个表达式是不能被处理的。于是,它触发了 ZeroDivisionError,这个 “意外” 使得程序不可能继续执行下去。
在 Python 中,定义了大量的常见 “意外”,并且按层级分类。
在读完第三部分后,可以回来重新查看以下官方文档:
https://xue.cn/hub/reader?bookId=61&path=book_59/library/exceptions.ipynb
### 关于错误处理
关于错误处理的更多内容,我们可以在阅读完第三部分中与 Class 相关的内容之后,再去详细阅读以下官方文档:
* Errors and Exceptions:https://xue.cn/hub/reader?bookId=61&path=book_59/tutorial/errors.ipynb
* Built-in Exceptions:https://xue.cn/hub/reader?bookId=61&path=book_59/library/exceptions.ipynb
* Handling Exceptions:https://wiki.python.org/moin/HandlingExceptions
# 小结
理论上,这一章不应该套上这么大的标题:《测试驱动开发》。
因为在实际开发过程中,所谓测试驱动开发,要使用更为强大更为复杂的模块、框架和工具,比如,起码使用 Python 内建库中的 unittest 模块。
在写程序的过程中,为别人(和将来的自己)写注释、写 Docstring,我们应该保障程序的结果全面正确而写测试,以及在最初写的时候就考虑到各种意外而使用试错语句块 ……
这些明明是天经地义的事情,但很多人因为感觉有点麻烦就没有去做…...
然后,这里变成了 “聪明反被聪明误” 的最好示例长期堆积的地方。
很多人真的是因为自己很聪明,所以才觉得 “没必要麻烦” 。
这就好像当年苏格拉底仗着自己记忆力无比强大甚至干脆过目不忘于是鄙视一切记笔记的人一样。
但是,随着时间的推移,随着工程量的放大,到最后,那些 “聪明人” 都被自己坑死了 。
实际上,聪明本身搞不定工程,能搞定工程的是智慧。
就像苏格拉底自己并没完成任何工程,是他的学生柏拉图不顾他的嘲笑用纸笔记录了一切,然后柏拉图的学生亚里士多德才有机会受到苏格拉底的启发,写了《前分析篇》,提出对人类影响至今的 “三段论” 。
在第二部分中,为了让读者更容易集中精力去理解关于自己动手写函数的方方面面,刻意选择了比较简单的例子放在这里。
但是,当我们真的动手去做,哪怕真的去阅读真实的工程代码,就会发现,这一部分的难度还是很高的。
现在的轻敌,会造成以后的溃败。
等我们把整本书都完成之后,要记得回来看这两个链接:
* doctest —— Test interactive Python examples:https://xue.cn/hub/reader?bookId=61&path=book_59/library/doctest.ipynb
* unittest —— Unit testing framework:https://xue.cn/hub/reader?bookId=61&path=book_59/library/unittest.ipynb
# 第11章 第8节可执行的Python文件
理论上来讲,我们可以把任何一个程序,无论大小,都封装(或者囊括)到仅仅一个函数之中。
按照惯例(Convention),这个函数叫做 main()。
当一个模块(就是存有 Python 代码的 .py 文件,例如:mycode.py)被 import 语句导入的时候,这个模块的 __name__ 就是模块名(例如:'mycode')。
而当一个模块被命令行运行的时候,这个模块的 __name__ 就被 Python 解释器设定为 '__main__'。
把一个程序整个封装到 main() 之中,而后在模块代码里加上:

这样做的结果是:
* 当 Python 文件被当作模块,被 import 语句导入时,if 判断失败,main() 函数不被执行;
* 当 Python 文件被 python -m 运行的时候,if 判断成功,main() 函数才被执行。
**今日练习:**
双拼打字Day33
英语朗读Day403