Ну, да, если у вас есть два print
заявления в своем коде, и оба из них выполнены, вы получите две строки вывода.
Корень проблемы заключается в том, что ваша translate_word()
функция делает две вещи:
- Она возвращает перевод, если слово в словаре
- Он выводит сообщение об ошибке, если слово не в словарь
Вне вашей функции, когда вы ее называете, вы не можете сказать, что произошло. Так что, если слово отсутствует в словаре, происходят две вещи:
translate_word()
функция выводит сообщение об ошибке
print
оператор печатает возвращаемое значение translate_word()
которое, потому что вы ничего не возвращать в этом кейс, None
.
Причина, по которой он все еще делает второй print
, заключается в том, что вы не сказали этого не делать!
Этот код является беспорядочным. Иногда ваша функция возвращает перевод, а иногда и нет. Иногда он печатает сообщение, а иногда нет.Это затрудняет вызов вызывающего абонента (в данном случае) для планирования остальной части программы.
Что вы должны сделать, это переписать функцию translate_word()
, чтобы она сделала одно: возвращает переведенное слово. Если он не может, он должен вернуть None
.
def translate_word(word):
return dictionary.get(word, None)
(Обработка исключений не является необходимой; метод в словаре get()
делает это для вас На самом деле, вам не нужна функции вообще - dictionary.get(word, None)
не намного больше, чем translate_word(word)
- но мы будем. предположим, что в более крупной программе он будет делать некоторые другие вещи и должен быть своей собственной функцией. Также это немного читаемо.)
Мы возвращаем None
, а не строку «не найдена», чтобы мы могли, при необходимости , легко различают следующие две ситуации:
- Слово не найдено в словаре
- слово найдено в словаре, и его перевод английских слов «не найден»
None
не является строкой, поэтому он никогда не будет перевод для чего угодно. Это делает его безопасным для использования в качестве значения флага, указывающего, что слово не может быть найдено.
Когда вы вызываете функцию, вы затем проверяете возвращаемое значение, чтобы узнать, найдено ли это слово. Если это так, вы можете распечатать переведенное слово. В противном случае вы можете распечатать свое сообщение об ошибке.
translated_word = translate_word(word)
if translated_word is None:
print "The Italian word for %s is not found" % word
else:
print "The Italian word for %s is %s" % (word, translated_word)
Таким образом, весь код, который делает подобный материал, находится в одном месте, и его легко понять и обосновать. Это называется разделением интересов профессиональными программистами. Считается хорошей практикой, чтобы каждый кусок кода делал одно и только одно, потому что его легче понять, написать и сохранить. В частности, разделение частей ввода/вывода и обработки данных программы почти всегда будет сделать ее более простой.
Рассмотрите: вы потеряли информацию о том, что делала ваша программа, и ваша программа имеет менее десяти строк. Представьте себе, как трудно было бы понять такую программу, если бы у нее было миллион строк , и вы ее не писали!
Есть способы, вы можете упростить этот код еще дальше:
translated_word = translate_word(word)
print "The Italian word for %s is %s" % (word,
translated_word if translated_word else "not found")
Теперь вы говорите Python!
Пожалуйста, покажите нам какой-нибудь код. –
ok Я привел пример –