第 13 章 单元测试

13.1. 罗马数字程序介绍 II

在前面的章节中,通过阅读代码,你迅速“深入”,以最快的速度理解了各个程序。既然你已对 Python 有了一定的了解,那么接下来让我们看看程序开发之前 的工作。

在接下来的几章中,你将会编写、调试和优化一系列工具函数来进行罗马数字和阿拉伯数字之间的转换。你已从第 7.3 节 “个案研究:罗马字母”中获知构造和验证罗马数字的机制,现在我们要做的事是退后一步去思考如何将这些机制扩展到一个双向转换的工具。

罗马数字的规则有如下一些有趣的特点:

  1. 一个特定数字以罗马数字表示时只有单一方式。
  2. 反之亦然:一个有效的罗马数字表示的数也只对应一个阿拉伯数字表示。(也就是说转换成阿拉伯数字表示只有一种方法。)
  3. 我们研究的是 13999 之间的数字的罗马数字表示。(罗马数字有很多方法用以记录更大的数,例如在数字上加线表示1000倍的数,但你不必去理会这些。就本章而言,我们姑且把罗马数字限定在 13999 之间)。
  4. 罗马数字无法表示 0。(令人诧异,古罗马竟然没有 0 这个数字的概念。数字是为数数服务的,没有怎么数呢?)
  5. 罗马数字不能表示负数。
  6. 罗马数字无法表示分数和非整数。

基于如上所述,你将如何构造罗马数字转换函数呢?

roman.py 功能需求

  1. toRoman 应该能返回 13999 中任意数的罗马数字表示。
  2. toRoman 在遇到 13999 之外的数字时应该失败。
  3. toRoman 在遇到非整数时应该失败。
  4. fromRoman 应该能将给定的有效罗马数字表示转换为阿拉伯数字表示。
  5. fromRoman 在遇到无效罗马数字表示时应该失败。
  6. 将一个数转换为罗马数字表示,再转换回阿拉伯数字表示后应该和最初的数相同。因此,fromRoman(toRoman(n)) == n 对于 1..3999 之间所有 n 都适用。
  7. toRoman 返回的罗马数字应该使用大写字母。
  8. fromRoman 应该只接受大写罗马数字 (也就是说给定小写字母进行转换时应该失败)。

进一步阅读

  • 这个站点 有关于罗马数字更多的内容,包括罗马人如何使用罗马数字的迷人 历史 (简言之:充满偶然性和反复无常)。