小结

  • 计算机科学是研究如何解决问题的学科。

  • 计算机科学利用抽象这一工具来表示过程和数据。

  • 抽象数据类型通过隐藏数据的细节来使程序员能够管理问题的复杂度。

  • Python 是一门强大、易用的面向对象编程语言。

  • 列表、元组以及字符串是 Python 的內建有序集合。

  • 字典和集是无序集合。

  • 类使得程序员能够实现抽象数据类型。

  • 程序员既可以重写标准方法,也可以构建新的方法。

  • 类可以通过继承层次结构来组织。

  • 类的构造方法总是先调用其父类的构造方法,然后才处理自己的数据和行为。

讨论题

  1. 为校园里的人构建一个继承层次结构,包括教职员工及学生。他们有何共同之处?又有何区别?

  2. 为银行账户构建一个继承层次结构。

  3. 为不同类型的计算机构建一个继承层次结构。

  4. 利用本章提供的类,以交互方式构建一个电路并对其进行测试。

编程练习

  1. 实现简单的方法 getNum 和 getDen,它们分别返回分数的分子和分母。

  2. 如果所有分数从一开始就是最简形式会更好。修改 Fraction 类的构造方法,立即使用最大公因数来化简分数。注意,这意味着 __add__ 不再需要化简结果。

  3. 实现下列简单的算术运算:__sub____mul____truediv__

  4. 实现下列关系运算:__gt____ge____lt____le____ne__

  5. 修改 Fraction 类的构造方法,使其检查并确保分子和分母均为整数。如果任一不是整数,就抛出异常。

  6. 我们假设负的分数是由负的分子和正的分母构成的。使用负的分母会导致某些关系运算符返回错误的结果。一般来说,这是多余的限制。请修改构造方法,使得用户能够传入负的分母,并且所有的运算符都能返回正确的结果。

  7. 研究 __radd__ 方法。它与 __add__ 方法有何区别?何时应该使用它?请动手实现 __radd__

  8. 研究 __iadd__ 方法。它与 __add__ 方法有何区别?何时应该使用它?请动手实现 __iadd__

  9. 研究 __repr__ 方法。它与 __str__ 方法有何区别?何时应该使用它?请动手实现 __repr__

  10. 研究其他类型的逻辑门(例如与非门、或非门、异或门)。将它们加入电路的继承层次结构。你需要额外添加多少代码?

  11. 最简单的算术电路是半加器。研究简单的半加器电路并实现它。

  12. 将半加器电路扩展为 8 位的全加器。

  13. 本章展示的电路模拟是反向工作的。换句话说,给定一个电路,其输出结果是通过反向访问输入值来产生的,这会导致其他的输出值被反向查询。这个过程一直持续到外部输入值被找到,此时用户会被要求输入数值。修改当前的实现,使电路正向计算结果。当收到输入值的时候,电路就会生成输出结果。

  14. 设计一个表示一张扑克牌的类,以及一个表示一副扑克牌的类。使用这两个类实现你最喜欢的扑克牌游戏。

  15. 在报纸上找到一个数独游戏,并编写一个程序求解。