导航:起始页 > Dive Into Python > 动态函数 > plural.py, 第 3 阶段 | << >> | ||||
深入 Python :Dive Into Python 中文版Python 从新手到专家 [Dip_5.4b_CPyUG_Release] |
将每个匹配和规则应用分别制作成函数没有必要。你从来不会直接调用它们:你把它们定义于 rules 列表之中并从那里调用它们。让我们隐去它们的函数名而抓住规则定义的主线。
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。让我们提炼出这些共同点。
<< plural.py, 第 2 阶段 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
plural.py, 第 4 阶段 >> |