以下摘录自《Think Python》。
随着你写的函数越来越大,你在调试上花的时候可能会越来越多。为了应对越来越复杂的程序,你可能会想尝试一种叫作增量式开发(incremental development )的方法。
增量式开发的目标,是通过每次只增加和测试少量代码,来避免长时间的调试。
举个例子,假设你想计算两个给定坐标点和之间的距离。根据勾股定理,二者的距离是:
第一步要考虑的是在 Python 中,距离函数看起来会是什么样。换句话说,输入(形参)和输出(返回值)是什么?
本例中,输入是可以用 4 个数表示的两个点。返回值是距离, 用浮点数表示。
现在你就可以写出此函数的轮廓了:
def distance(x1, y1, x2, y2):
return 0.0
显然,此版本不能计算距离;它总是返回 0 。但是在语法上它是正确的,并且能运行,这意味着你可以在使它变得更复杂之前测试它。
用样例实参调用它来进行测试。
>>> distance(1, 2, 4, 6)
0.0
此时我们已经确认这个函数在语法上是正确的,我们可以开始往函数体中增加代码。 下一步合理的操作,应该是求和这两个差值。 下一个版本在临时变量中存储这些值并打印出来。
def distance(x1, y1, x2, y2):
dx = x2 - x1
dy = y2 - y1
print('dx is', dx)
print('dy is', dy)
return 0.0
如果这个函数正常运行,它应该显示 dx is 3 以及 dy is 4 。 这样的话我们就知道函数获得了正确的实参并且正确执行了第一步计算。 如果不是,也只要检查几行代码。
下一步我们计算 dx 和 dy 的平方和。
def distance(x1, y1, x2, y2):
dx = x2 - x1
dy = y2 - y1
dsquared = dx**2 + dy**2
print('dsquared is: ', dsquared)
return 0.0
再一次运行程序并检查结果(应是25)。最后,你可以使用 math.sqrt 计算并返回结果。
def distance(x1, y1, x2, y2):
dx = x2 - x1
dy = y2 - y1
dsquared = dx**2 + dy**2
result = math.sqrt(dsquared)
return result
如果其正确运行的话,你就成功了。
当你刚开始的时候,最好每次只加入一两行代码。 随着经验见长,你会发现自己可以编写、调试更大的代码块了。 无论哪种方式,增量式开发都能节省你大量的调试时间。
这种开发方式的关键是:
- 从一个能运行的程序开始,并且每次只增加少量改动。无论你何时遇到错误,都能够清楚定位错误的源头。
- 用临时变量存储中间值,这样你就能显示并检查它们。
- 一旦程序正确运行,你要删除一些脚手架代码,或者将多条语句组成复合表达式,但是前提是不会影响程序的可读性。
网友评论