Остальное условие на Python в то время как заявление

Я заметил, что следующий код допустим в Python. У меня вопрос почему? Есть ли конкретная причина?

n = 5
while n != 0:
    print n
    n -= 1
else:
    print "what the..."

14 ответов

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()

else Предложение выполняется, если вы обычно выходите из блока, выполняя условие цикла или опускаясь в нижнюю часть блока try. Не выполняется, если вы break или же return вне блока или поднять исключение. Это работает не только для циклов while и for, но и для блоков try.

Обычно вы обнаруживаете это в тех местах, где обычно вы выходите из цикла раньше, а выход из конца цикла - неожиданный / необычный случай. Например, если вы просматриваете список в поисках значения:

for value in values:
    if value == 5:
        print "Found it!"
        break
else:
    print "Nowhere to be found. :-("

В ответ на 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 Оператор, выполненный в первом наборе, пропускает остальную часть набора и возвращается к проверке выражения.

Предложение else выполняется только тогда, когда условие while становится ложным.

Вот некоторые примеры:

Пример 1: Изначально условие ложно, поэтому выполняется условие else.

i = 99999999

while i < 5:
    print(i)
    i += 1
else:
    print('this')

ВЫХОД:

this

Пример 2: вто время как условие i < 5 никогда не становился ложным, потому что i == 3прерывает цикл, поэтому предложение else не было выполнено.

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, поэтому было выполнено else-clause.

i = 0

while i < 5:
    print(i)
    i += 1
else:
    print('this')

ВЫХОД:

0
1
2
3
4
this

Мой ответ будет сосредоточен на том, КОГДА мы можем использовать 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 чтобы понять код, и этот синтаксис имеет для меня гораздо больше смысла.

      thing = 'hay'
while thing:
  if thing == 'needle':
    print('I found it!!')  # wrap up for break
    break
  thing = haystack.next()
else:
  print('I did not find it.')  # wrap up for no-break

Возможно, неудачно названное -clause - это ваше место, чтобы без перерыва выйти из исчерпания цикла .

Можно обойтись без него, если

  • ты порвал сreturnилиraise→ весь код после вызова илиtryэто ваше место без перерыва
  • вы установили значение по умолчанию передwhile(напримерfound = False)
    • но это может скрыть ошибки, которых -clause знает, чтобы избежать

Если вы используете множественный разрыв с нетривиальным завершением, вы должны использовать простое присваивание перед разрывом, присваивание -clause для отсутствия разрыва иif-elif-elseилиmatch-caseчтобы избежать повторения нетривиального кода обработки разрыва.

Примечание: то же самое относится кfor thing in haystack:

Else выполняется, если цикл while не прервался.

Мне нравится думать об этом с помощью метафоры "бегуна".

"Else" похоже на пересечение финишной черты, независимо от того, начали ли вы в начале или в конце трассы. "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 (Date != "January 1st"):
    time.sleep(1)
else:
    print("Happy new year!")

else: оператор выполняется тогда и только тогда, когда цикл while больше не соответствует своему условию (в вашем примере, когда n != 0 ложно).

Таким образом, результат будет следующим:

5
4
3
2
1
what the...

Предположим, вы ищете элемент x в единственном связанном списке

          def search(self, x):
        position = 1
        p =self.start
        while p is not None:
            if p.info == x:
                print(x, " is at position ", position)
                return True
            position += 1
            p = p.link
        else:
            print(x, "not found in list") 
            return False

Так что, если условия пока не выполняются, выполнится еще одно, надеюсь, это поможет!

Лучше использовать конструкцию while: else: в Python: если цикл не выполняется в while, тогда выполняется оператор else. То, как это работает сегодня, не имеет смысла, потому что вы можете использовать приведенный ниже код с такими же результатами...

n = 5
while n != 0:
    print n
    n -= 1
print "what the..."

Насколько мне известно, основная причина добавления else в циклы на любом языке - это случаи, когда итератор не включен в вашем управлении. Представьте, что итератор находится на сервере, и вы просто даете ему сигнал для выборки следующих 100 записей данных. Вы хотите, чтобы цикл продолжался до тех пор, пока длина полученных данных равна 100. Если он меньше, вам нужно повторить цикл еще раз, а затем завершить его. Есть много других ситуаций, когда вы не можете контролировать последнюю итерацию. Возможность добавить else в этих случаях значительно упрощает работу.

Другие вопросы по тегам