В настоящее время я изучаю программу на Python, используя книгу Dive Into Python 3 (среди прочего). Ниже приведен пример из 5-й главы книги, демонстрирующий использование функций листинга для множественного слова.Python: issue with return statement
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 я не получаю правильный результат для таких слов, как «студент» (слова, которые имеют простую форму множественного числа, последнее правило). Нет проблем со словами, которые подпадают под остальные правила.
Вот что я получаю сформировать интерпретатор:
>>> 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'
В вашем источнике есть опечатка: 'match_y' использует' re.sub', а не 're.search' – Keeper
вы уверены, что используете последнюю версию кода в IDLE? Я предполагаю, что вы не перезагрузили свой код после своих изменений. – shx2