导航: 起始页 > Dive Into Python > 动态函数 > plural.py, 第 4 阶段 | << >> | ||||
Python 研究(Dive Into Python)Python 从新手到高手 [DIP_5_4_CPUG_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 阶段 >> |