Я заметил, что следующий код разрешен в Python. Мой вопрос в том, почему? Есть ли конкретная причина?
n = 5 while n != 0: print n n -= 1 else: print"what the..."
Многие новички случайно натыкаются на этот синтаксис, когда пытаются поместить блок if/else внутри цикла while or for и не делают отступ else должным образом. Решение состоит в том, чтобы убедиться, что else блок совпадает с if, предполагая, что вы намеревались соединить их. Этот вопрос объясняет, почему это не вызвало синтаксической ошибки, и что означает результирующий код. Смотрите также, я получаю ошибку IndentationError . Как мне это исправить?, для случаев, когда есть сообщение о синтаксической ошибке.
Предложение else выполняется только тогда, когда ваше while условие становится ложным. Если вы break выйдете из цикла или возникнет исключение, оно выполняться не будет.
Один из способов представить это как конструкцию if / else относительно условия:
if condition: handle_true() else: handle_false()
аналогично конструкции с циклическим выполнением:
while condition: handle_true() else: # condition is false now, handle and go on with the rest of the program handle_false()
Пример может быть примерно таким:
while value < threshold: ifnot process_acceptable_value(value): # something went wrong, exit the loop; don't pass go, don't collect 200 break value = update(value) else: # value >= threshold; pass go, collect 200 handle_threshold_reached()
Ответ 2
Предложение else выполняется, если вы выходите из блока обычным образом, выполняя условие цикла или выпадая из нижней части блока try. Оно не выполняется, если вы break или return выходите из блока или создаете исключение. Это работает не только для циклов while и for, но и для блоков try.
Обычно вы находите его в местах, где обычно завершаете цикл раньше, а завершение цикла является неожиданным / необычным случаем. Например, если вы перебираете список в поисках значения:
for value in values: if value == 5: print"Found it!" break else: print"Nowhere to be found. :-("
Ответ 3
Позвольте мне привести пример того, зачем использовать это else-предложение. Но:
теперь моя точка зрения лучше объяснена в ответе Лео
Я использую for- вместо while-цикла, но else работает аналогично (выполняется, если не был обнаружен break)
есть лучшие способы сделать это (например, обернуть это в функцию или вызвать исключение)
Выход из нескольких уровней цикла
Вот как это работает: внешний цикл имеет разрыв в конце, поэтому он будет выполнен только один раз. Однако, если внутренний цикл завершается (не находит делителя), то он достигает оператора else, а внешний разрыв никогда не достигается. Таким образом, разрыв во внутреннем цикле приведет к разрыву обоих циклов, а не только одного.
for k in [2, 3, 5, 7, 11, 13, 17, 25]: for m inrange(2, 10): if k == m: continue print'trying %s %% %s' % (k, m) if k % m == 0: print'found a divisor: %d %% %d; breaking out of loop' % (k, m) break else: continue print'breaking another level of loop' break else: print'no divisor could be found!'
Ответ 4
Предложение else выполняется, когда условие while принимает значение false.
Оператор while используется для повторного выполнения до тех пор, пока выражение имеет значение true:
while_stmt ::= "while" expression ":" suite ["else"":" suite]
Это повторно проверяет выражение и, если оно истинно, выполняет первый набор; если выражение равно false (что может быть при первом тестировании), выполняется набор из else предложения, если оно присутствует, и цикл завершается.
break Оператор, выполняемый в первом наборе, завершает цикл без выполнения набора else предложений. Оператор continue, выполняемый в первом наборе, пропускает остальную часть набора и возвращается к тестированию выражения.