你现在的位置:首页 > 深入 Python > 动态函数 > plural.py,阶段 4 | << >> | ||||
深入 Python从 Python 新手到专家 |
让我们将代码中的重复部分提取出来,以便更容易定义新的规则。
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 >> |