导航:起始页 > Dive Into Python > 动态函数 > plural.py, 第 4 阶段 | << >> | ||||
深入 Python :Dive Into Python 中文版Python 从新手到专家 [Dip_5.4b_CPyUG_Release] |
让我们精炼出代码中的重复之处,以便更容易地定义新规则。
import re def buildMatchAndApplyFunctions((pattern, search, replace)): matchFunction = lambda word: re.search(pattern, word) applyFunction = lambda word: re.sub(search, replace, word) return (matchFunction, applyFunction)
如果这太费解 (它应该是这样,这是个怪异的东西),可能需要通过了解它的使用来搞明白。
patterns = \ ( ('[sxz]$', '$', 'es'), ('[^aeioudgkprt]h$', '$', 'es'), ('(qu|[^aeiou])y$', 'y$', 'ies'), ('$', '$', 's') ) rules = map(buildMatchAndApplyFunctions, patterns)
我发誓这不是我信口雌黄:rules 被转换成了前面范例中相同的内容。剖析 rules 的定义,你看到的是:
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)
还不够兴奋吧!我必须承认,在定义 buildMatchAndApplyFunctions 时我跳过了一个微妙之处。让我们回过头再看一下。
def buildMatchAndApplyFunctions((pattern, search, replace)):
>>> def foo((a, b, c)): ... print c ... print b ... print a >>> parameters = ('apple', 'bear', 'catnap') >>> foo(parameters) catnap bear apple
现在,让我们回过头看一看这个元组自动展开技巧的必要性。patterns 是一个元组列表,并且每个元组都有三个元素。调用 map(buildMatchAndApplyFunctions, patterns),这并不 意味着是以三个参数调用 buildMatchAndApplyFunctions。使用 map 映射一个列表到函数时,通常使用单参数:列表中的每个元素。就 patterns 而言,列表的每个元素都是一个元组,所以 buildMatchAndApplyFunctions 总是是以元组来调用,在 buildMatchAndApplyFunctions 中使用元组自动展开技巧将元素赋值给可以被使用的变量。
<< plural.py, 第 3 阶段 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
plural.py, 第 5 阶段 >> |