17.4. plural.py, 第 3 阶段
Description: Python from novice to pro
Keywords: Python, Dive Into Python, tutorial, object-oriented, programming, documentation, book, free

# 深入 Python :Dive Into Python 中文版 Python 从新手到专家 [Dip_5.4b_CPyUG_Release] | Find:

## 17.4. `plural.py`, 第 3 阶段

将每个匹配和规则应用分别制作成函数没有必要。你从来不会直接调用它们：你把它们定义于 `rules` 列表之中并从那里调用它们。让我们隐去它们的函数名而抓住规则定义的主线。

### 例 17.8. `plural3.py`

    import re

    rules = \
      (
        (
         lambda word: re.search('[sxz]$', word),
         lambda word: re.sub('$', 'es', word)
        ),
        (
         lambda word: re.search('[^aeioudgkprt]h$', word),
         lambda word: re.sub('$', 'es', word)
        ),
        (
         lambda word: re.search('[^aeiou]y$', word),
         lambda word: re.sub('y$', 'ies', word)
        ),
        (
         lambda word: re.search('$', word),
         lambda word: re.sub('$', 's', word)
        )
       )

    def plural(noun):
        for matchesRule, applyRule in rules:
            if matchesRule(noun):
                return applyRule(noun)

| 这与第 2 阶段定义的规则是一样的。惟一的区别是不再定义 `match_sxz` 和 `apply_sxz` 之类的函数，而是以 lambda 函数 法将这些函数的内容直接 “嵌入” `rules` 列表本身。
| 注意 `plural` 函数完全没有变化，还是反复于一系列的规则函数，检查第一个匹配规则，如果返回真则调用第二个应用规则并返回值。和前面一样，给定单词返回单词。唯一的区别是规则函数被内嵌定义，化名作 lambda 函数。但是 `plural` 函数并不在乎它们是如何定义的，只是拿到规则列表，闭着眼睛干活。

现在添加一条新的规则，所有你要做的就是直接在 `rules` 列表之中定义函数：一个匹配规则，一个应用规则。这样内嵌的规则函数定义方法使得没必要的重复很容易被发现。你有四对函数，它们采用相同的模式。匹配函数就是调用 `re.search`，应用函数就是调用 `re.sub`。让我们提炼出这些共同点。