Python:return语句的问题

时间:2013-12-08 22:23:34

标签: python function tuples return

我目前正在学习使用Dive Into Python 3(以及其他)编写Python程序。下面是本书第5章中的示例,演示了列表函数的使用,以便复数词。

import re

def match_sxz(noun):
    return re.search('[sxz]$', noun)

def apply_sxz(noun):
    return re.sub('$', 'es', noun)

def match_h(noun):
    return re.search('[^aeioudgkprt]h$', noun)

def apply_h(noun):
    return re.sub('$', 'es', noun)

def match_y(noun):
    return re.sub('y$', 'ies', noun)

def apply_y(noun):
    return re.sub('y$', 'ies', noun)

def match_default(noun):
    return True

def apply_default(noun):
    return noun + 's'

rules = ((match_sxz, apply_sxz),
         (match_h, apply_h),
         (match_y, apply_y),
         (match_default, apply_default)
         )

def plural(noun):
        for (matches_rule, apply_rule) in rules:
            if matches_rule(noun):
                return apply_rule(noun)

问题在于,当我试图在IDLE中执行代码时,我没有得到像“student”这样的单词的正确结果(具有简单复数形式的单词 - 最后一条规则)。其他规则下的单词没有问题。

以下是我从口译员那里得到的内容:

>>> import plural
>>> plural.plural('copy')
'copies'
>>> plural.plural('hoax')
'hoaxes'
>>> plural.plural('beach')
'beaches'
>>> plural.plural('student')
'student'

真的很奇怪的是,当我从解释器调用apply_default()函数时,工作就完成了!

>>> plural.apply_default('student')
'students'

2 个答案:

答案 0 :(得分:0)

在您的代码中,match_y将始终评估为True。另外,请查看re.sub:

的文档
  

re.sub(pattern, repl, string, count=0, flags=0)

Return the string obtained by replacing the leftmost non-overlapping occurrences of pattern in string by the replacement
     

REPL。如果未找到模式,则返回字符串不变。 REPL   可以是字符串或函数;如果它是一个字符串,任何反斜杠   其中的逃逸被处理。也就是说,\ n被转换为单个   换行符,\ r \ n将转换为回车符,依此类推。   诸如\ j之类的未知转义单独留下。反向引用,例如\ 6,   被替换为模式中由组6匹配的子字符串。

来源: http://docs.python.org/2/library/re.html

答案 1 :(得分:0)

您的match_y功能错误:

def match_y(noun):
    # return re.sub('y$', 'ies', noun)   # NO!
    return re.search('y$', noun)

它总是返回一个非空字符串,当作为布尔值测试时,它被计为True;所以你应用了apply_y规则,因为你的单词上没有-y而没有做任何规则,并且返回了结果(即原始单词)。