Остальное условие на Python в то время как заявление - PullRequest
276 голосов
/ 21 июля 2010

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

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

Ответы [ 8 ]

338 голосов
/ 21 июля 2010

Предложение 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()
86 голосов
/ 21 июля 2010

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

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

for value in values:
    if value == 5:
        print "Found it!"
        break
else:
    print "Nowhere to be found. :-("
39 голосов
/ 08 июня 2014

В ответ на 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.

В большинстве случаев есть лучшие способы сделать это (обернуть это в функцию или вызвать исключение), но это работает!

18 голосов
/ 21 июля 2010

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

Из документации :

Оператор while используется для повторного выполнения, пока выражение истинно:

while_stmt ::=  "while" expression ":" suite
                ["else" ":" suite]

Это многократно проверяет выражение и, если оно истинно, выполняет первый набор; если выражение ложно (что может быть в первый раз, когда оно проверяется), выполняется набор предложения else, если он присутствует, и цикл завершается.

Оператор break, выполненный в первом наборе, завершает цикл, не выполняя набор предложения else. Оператор continue, выполненный в первом наборе, пропускает остальную часть набора и возвращается к проверке выражения.

14 голосов
/ 24 октября 2014

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

2 голосов
/ 19 марта 2018

Это полезно для социального взаимодействия.

while (Date != "January 1st"):
    time.sleep(1)
else:
    print("Happy new year!")
0 голосов
/ 24 мая 2013

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

n = 5
while n != 0:
    print n
    n -= 1
print "what the..."
0 голосов
/ 21 июля 2010

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

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

5
4
3
2
1
what the...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...