Я заметил, что следующий код допустим в Python. Мой вопрос почему? Есть ли конкретная причина?
n = 5
while n != 0:
print n
n -= 1
else:
print "what the..."
after:
.
Я заметил, что следующий код допустим в Python. Мой вопрос почему? Есть ли конкретная причина?
n = 5
while n != 0:
print n
n -= 1
else:
print "what the..."
after:
.
Ответы:
Предложение 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:
if not 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()
while {} something
за исключением того, что something
будет пропущено, если вы break
в while
цикле.
Предложение else
выполняется, если вы обычно выходите из блока, выполняя условие цикла или опускаясь в нижнюю часть блока try. Он не выполняется, если вы break
либо return
вышли из блока, либо вырастите исключение. Он работает не только для циклов while и for, но и для блоков try.
Обычно вы обнаруживаете это в тех местах, где обычно вы выходите из цикла раньше, а выход из конца цикла - неожиданный / необычный случай. Например, если вы просматриваете список в поисках значения:
for value in values:
if value == 5:
print "Found it!"
break
else:
print "Nowhere to be found. :-("
found_it=False
в начале цикла, а затем сделать проверку found_it
в конце
В ответ на Is there a specific reason?
это одно интересное приложение: преодоление нескольких уровней зацикливания.
Вот как это работает: внешний цикл имеет разрыв в конце, поэтому он будет выполнен только один раз. Однако, если внутренний цикл завершается (не находит делителя), то он достигает оператора else и внешний разрыв никогда не достигается. Таким образом, разрыв во внутреннем цикле будет нарушать оба цикла, а не только один.
for k in [2, 3, 5, 7, 11, 13, 17, 25]:
for m in range(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!'
Для обоих while
и for
циклов else
оператор выполняется в конце, если не break
был использован.
В большинстве случаев есть лучшие способы сделать это (обернуть это в функцию или вызвать исключение), но это работает!
Предложение else выполняется, когда условие while оценивается как false.
Из документации :
Оператор while используется для повторного выполнения, если выражение истинно:
while_stmt ::= "while" expression ":" suite ["else" ":" suite]
Это многократно проверяет выражение и, если оно истинно, выполняет первый набор; если выражение ложно (что может быть в первый раз, когда оно проверено), набор
else
предложений, если он присутствует, и цикл завершается.
break
Заявление выполняется в первом набора завершает цикл без выполненияelse
набора Пункта в.continue
Заявление выполняется в первом пакета пропускает оставшуюся часть пакета и возвращается к проверке выражения.
Мой ответ будет сосредоточен на том, КОГДА мы можем использовать while / for-else.
На первый взгляд кажется, что при использовании
while CONDITION:
EXPRESSIONS
print 'ELSE'
print 'The next statement'
и
while CONDITION:
EXPRESSIONS
else:
print 'ELSE'
print 'The next statement'
Потому что print 'ELSE'
оператор, кажется, всегда выполняется в обоих случаях (оба, когда while
цикл закончен или не запущен).
Тогда это отличается только тогда, когда инструкция print 'ELSE'
не будет выполнена. Это когда break
внутри блока кода естьwhile
In [17]: i = 0
In [18]: while i < 5:
print i
if i == 2:
break
i = i +1
else:
print 'ELSE'
print 'The next statement'
....:
0
1
2
The next statement
Если отличаются:
In [19]: i = 0
In [20]: while i < 5:
print i
if i == 2:
break
i = i +1
print 'ELSE'
print 'The next statement'
....:
0
1
2
ELSE
The next statement
return
не в этой категории, потому что это делает тот же эффект для двух вышеупомянутых случаев.
Повышение исключения также не вызывает разницы, потому что, когда оно возникает, то, где будет выполняться следующий код, находится в обработчике исключений (кроме блока), код в else
предложении или сразу после while
предложения не будет выполнен.
Я знаю, что это старый вопрос, но ...
Как сказал Раймонд Хеттингер, его следует называть while/no_break
вместо while/else
.
Мне легко понять, если вы посмотрите на этот фрагмент.
n = 5
while n > 0:
print n
n -= 1
if n == 2:
break
if n == 0:
print n
Теперь вместо проверки условия после цикла while мы можем поменять его местами else
и избавиться от этой проверки.
n = 5
while n > 0:
print n
n -= 1
if n == 2:
break
else: # read it as "no_break"
print n
Я всегда читаю его, while/no_break
чтобы понять код, и этот синтаксис имеет для меня гораздо больше смысла.
Предложение else выполняется только тогда, когда условие while становится ложным.
Вот некоторые примеры:
Пример 1: изначально условие ложно, поэтому выполняется условие else .
i = 99999999
while i < 5:
print(i)
i += 1
else:
print('this')
ВЫВОД:
this
Пример 2: пока условие i < 5
не стало ложным , поскольку i == 3
перерывы цикл, поэтому еще придаточный не был выполнен.
i = 0
while i < 5:
print(i)
if i == 3:
break
i += 1
else:
print('this')
ВЫВОД:
0
1
2
3
Пример 3: в то время как условие i < 5
становится ложным , когда i
был 5
, так еще придаточный был выполнен.
i = 0
while i < 5:
print(i)
i += 1
else:
print('this')
ВЫВОД:
0
1
2
3
4
this
Оператор else:
выполняется тогда и только тогда, когда цикл while больше не соответствует своему условию (в вашем примере, когда n != 0
false).
Таким образом, результат будет следующим:
5
4
3
2
1
what the...
Остальное выполняется, если цикл while не прерывался.
Мне нравится думать об этом с метафорой «бегун».
«Остальное» похоже на пересечение финишной линии, независимо от того, начали ли вы в начале или в конце трассы. «else» не выполняется, только если вы прервались где-то посередине.
runner_at = 0 # or 10 makes no difference, if unlucky_sector is not 0-10
unlucky_sector = 6
while runner_at < 10:
print("Runner at: ", runner_at)
if runner_at == unlucky_sector:
print("Runner fell and broke his foot. Will not reach finish.")
break
runner_at += 1
else:
print("Runner has finished the race!") # Not executed if runner broke his foot.
Основными вариантами использования является использование этого выхода из вложенных циклов или если вы хотите запускать некоторые операторы, только если цикл где-то не прерывался (подумайте, что разрыв - это необычная ситуация).
Например, ниже приведен механизм выхода из внутреннего цикла без использования переменных или try / catch:
for i in [1,2,3]:
for j in ['a', 'unlucky', 'c']:
print(i, j)
if j == 'unlucky':
break
else:
continue # Only executed if inner loop didn't break.
break # This is only reached if inner loop 'breaked' out since continue didn't run.
print("Finished")
# 1 a
# 1 b
# Finished
Лучше использовать конструкцию while: else: в Python: если цикл не выполняется в while, тогда выполняется оператор else. То, как это работает сегодня, не имеет смысла, потому что вы можете использовать приведенный ниже код с такими же результатами ...
n = 5
while n != 0:
print n
n -= 1
print "what the..."
else
блок не будет выполнен, если вы покидаете цикл, используя ключевое слово break
или return
. В вашем примере print
будет выполнено также, если цикл завершился по break
команде.
Это полезно для социального взаимодействия.
while (Date != "January 1st"):
time.sleep(1)
else:
print("Happy new year!")
else
здесь? Код делает то же самое без него.
break
во время обратного отсчета, не используя else
, заставит вас сказать "С новым годом!" мгновенно, что не имеет никакого смысла.
break
"? Там нет break
в коде.
else
для этого использования был удивительно плохой идеей, и что они больше не будут делать этого.