Как избежать остальных строк в питоне - PullRequest
0 голосов
/ 19 января 2012

привет, я использую try и, за исключением случаев, когда я получил распечатку, кроме случаев, когда есть еще какая-то информация, она продолжает читать когда я использую break это выдает ошибку break вне цикла. Как мне остановить Python, чтобы прочитать остальные строки? Спасибо

def translate_word(word):

    try:
        return dictionary[word]
    except KeyError:
        print 'The ' + str(language) + ' word for ' + str(word) + ' is not found'

if language == "Italian" :
    create_dictionary('Italian')
    print "The Italian word for " + str(word) + " is " + str(translate_word(word))

И это печатается так:

The Italian word for rubbish is not found

The Italian word for rubbish is None

Где, как я только хочу, как:

The Italian word for rubbish is not found

Ответы [ 5 ]

2 голосов
/ 19 января 2012

Что ж, да, если в вашем коде два оператора print, и оба они выполнены, вы получите две строки вывода.

Корень проблемы в том, что ваша функция translate_word() делает две вещи:

  1. Возвращает перевод, если слово есть в словаре
  2. Распечатывает сообщение об ошибке, если слово отсутствует в словаре

Вне вашей функции, когда вы ее вызываете, вы не можете сказать, что произошло. Поэтому, если слова нет в словаре, происходят две вещи:

  1. Функция translate_word() выводит сообщение об ошибке
  2. Оператор 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», чтобы при необходимости мы могли легко различить следующие две ситуации:

  1. Слово не найдено в словаре
  2. Слово найдено в словаре, и его переводом являются английские слова "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!

1 голос
/ 19 января 2012

Вы обычно break вне цикла:

for line in open('filename', 'r'):
  if line is 'foo':
    break

  # Line isn't foo. Keep going
1 голос
/ 19 января 2012

Тогда вы должны просто сделать:

result = dictionary.get(word, 'Not Found')
print "The Italian word for " + str(word) + " is " + result

Из официальной документации :
get(key[, default]) Возвращает значение для ключа, если ключ находится в словаре, иначе по умолчанию.

Обновление: get можно использовать даже для кода в комментарии.

Пример:

create_dictionary('Spanish').get(word, 'Not Found')
0 голосов
/ 19 января 2012

Использование ::

numCheck = 1
def translate_word(word):  
 try:         
  return dictionary[word]     
 except KeyError:         
  print 'The ' + str(language) + ' word for ' + str(word) + ' is not found'  
  numCheck = 0

if language == "Italian" and numCheck != 0:     
 create_dictionary('Italian')     
 print "The Italian word for " + str(word) + " is " + str(translate_word(word))

должно помочь. Если вам не нужно выполнять больше операций, вы можете использовать exit () для выхода из сценария.

0 голосов
/ 19 января 2012

Вы можете полностью заменить функцию простым dict.get:

if language == "Italian" :
    create_dictionary('Italian')
    print "The Italian word for " + str(word) + " is " + dictionary.get(word, "not found")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...