返回介绍

17.4. plural.py, 第 3 阶段

发布于 2019-09-14 13:30:59 字数 1935 浏览 824 评论 0 收藏 0

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文