Что ж, да, если в вашем коде два оператора 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
вместо строки «not found», чтобы при необходимости мы могли легко различить следующие две ситуации:
- Слово не найдено в словаре
- Слово найдено в словаре, и его переводом являются английские слова "not found"
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!