第 17 章 动态函数

17.1. 概览

我想谈谈名词复数。 还有,返回其它函数的函数,高级的正则表达式和生成器(Generator)。生成器是 Python 2.3 新引入的。 但首先还是让我们先来谈谈如何生成名词复数。

如果你还没有看过 第 7 章 正则表达式,现在是个绝佳的机会。 这章中假定你已理解了正则表达式的基础内容并迅速深入更高级的应用。

英语是一个吸收很多外来语而令人疯掉的语言,把单数名词变成复数的规则则是复杂而又多变的。 有规则,有例外,更有例外的例外。

如果你在英语国家长大或是在正规学校学习了英语,你可能对下面的基本规则很熟悉:

  1. 如果一个词以 S, X, Z,或者 ES结尾, “Bass” 变成 “basses”, “fax” 变成 “faxes”,还有 “waltz” 变成 “waltzes”。
  2. 如果一个词以发音的 H 加 ES 结尾,或以不发音的 H 加 S 结尾。 什么是发音的 H? 和其他字母混合在一起发出一个你可以听到的声音。 那么, “coach” 变成 “coaches” , “rash” 变成 “rashes”, 因为在读出来时,你可以听到 CH 和 SH 的声音。 但是, “cheetah” 变成 “cheetahs”,因为 H 不发音。
  3. 如果一个词以发 I 音的 Y 结尾,把 Y 变成 IES;如果 Y 与元音搭配在一起发出其他声音则只添加 S。因此, “vacancy” 变成 “vacancies”,但 “day” 变成 “days”.
  4. 如果一切规则都不适用,就只添加 S 并祈祷不会错。

(我知道有很多例外情况, 比如: “Man” 变成 “men”, “woman” 变成 “women”,但是, “human” 却变成 “humans”。 “Mouse” 变成 “mice”, “louse” 变成 “lice”, 但是, “house” 却变成 “houses”。 “Knife” 变成 “knives”, “wife” 变成 “wives”,但是 “lowlife” 却变成 “lowlifes”。 更不要说那些复数根本就不需要变化的词了,比如 “sheep”, “deer” 和 “haiku”。)

其他的语言当然完全不同。

让我们来设计一个复数化名词的模块吧! 从英语名词开始,仅考虑上面的四种规则,但是记得你将来需要不断添加规则,更可能最后添加进更多的语言。