2013-12-08 5 views
2

В настоящее время я изучаю программу на 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' 
+1

В вашем источнике есть опечатка: 'match_y' использует' re.sub', а не 're.search' – Keeper

+1

вы уверены, что используете последнюю версию кода в IDLE? Я предполагаю, что вы не перезагрузили свой код после своих изменений. – shx2

ответ

0

Ваша match_y функция не так:

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

Он всегда возвращает непустой строки, которая подсчитывает, как True при тестировании как логическое значение; поэтому вы применили правило apply_y, которое ничего не делало, потому что не было ни слова на вашем слове и возвращал результат (то есть исходное слово).

+0

Исправлено. Обновленный глаз всегда полезен. благодаря – Sorrop

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 может быть строкой или функцией; если это строка, обрабатывается любая обратная косая черта . То есть \ n преобразуется в один символ новой строки , \ r преобразуется в возврат каретки и т. Д. Неизвестные escape-последовательности, такие как \ j, остаются в силе. Обратные ссылки, такие как \ 6, , заменяются подстрокой, соответствующей группе 6 в шаблоне.

Источник: http://docs.python.org/2/library/re.html