Else clause on Python while statement

前端 未结 12 2163
悲&欢浪女
悲&欢浪女 2020-11-22 08:24

I\'ve noticed the following code is legal in Python. My question is why? Is there a specific reason?

n = 5
while n != 0:
    print n
    n -= 1
else:
    pri         


        
相关标签:
12条回答
  • 2020-11-22 08:59

    In reply to Is there a specific reason?, here is one interesting application: breaking out of multiple levels of looping.

    Here is how it works: the outer loop has a break at the end, so it would only be executed once. However, if the inner loop completes (finds no divisor), then it reaches the else statement and the outer break is never reached. This way, a break in the inner loop will break out of both loops, rather than just one.

    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!'
    

    For both while and for loops, the else statement is executed at the end, unless break was used.

    In most cases there are better ways to do this (wrapping it into a function or raising an exception), but this works!

    0 讨论(0)
  • 2020-11-22 08:59

    The else: statement is executed when and only when the while loop no longer meets its condition (in your example, when n != 0 is false).

    So the output would be this:

    5
    4
    3
    2
    1
    what the...
    
    0 讨论(0)
  • 2020-11-22 09:00

    The else clause is only executed when the while-condition becomes false.

    Here are some examples:

    Example 1: Initially the condition is false, so else-clause is executed.

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

    OUTPUT:

    this
    

    Example 2: The while-condition i < 5 never became false because i == 3 breaks the loop, so else-clause was not executed.

    i = 0
    
    while i < 5:
        print(i)
        if i == 3:
            break
        i += 1
    else:
        print('this')
    

    OUTPUT:

    0
    1
    2
    3
    

    Example 3: The while-condition i < 5 became false when i was 5, so else-clause was executed.

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

    OUTPUT:

    0
    1
    2
    3
    4
    this
    
    0 讨论(0)
  • 2020-11-22 09:04

    The else-clause is executed when the while-condition evaluates to false.

    From the documentation:

    The while statement is used for repeated execution as long as an expression is true:

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

    This repeatedly tests the expression and, if it is true, executes the first suite; if the expression is false (which may be the first time it is tested) the suite of the else clause, if present, is executed and the loop terminates.

    A break statement executed in the first suite terminates the loop without executing the else clause’s suite. A continue statement executed in the first suite skips the rest of the suite and goes back to testing the expression.

    0 讨论(0)
  • 2020-11-22 09:07

    Else is executed if while loop did not break.

    I kinda like to think of it with a 'runner' metaphor.

    The "else" is like crossing the finish line, irrelevant of whether you started at the beginning or end of the track. "else" is only not executed if you break somewhere in between.

    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.
    

    Main use cases is using this breaking out of nested loops or if you want to run some statements only if loop didn't break somewhere (think of breaking being an unusual situation).

    For example, the following is a mechanism on how to break out of an inner loop without using variables or 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
    
    0 讨论(0)
  • 2020-11-22 09:09

    The else clause is only executed when your while condition becomes false. If you break out of the loop, or if an exception is raised, it won't be executed.

    One way to think about it is as an if/else construct with respect to the condition:

    if condition:
        handle_true()
    else:
        handle_false()
    

    is analogous to the looping construct:

    while condition:
        handle_true()
    else:
        # condition is false now, handle and go on with the rest of the program
        handle_false()
    

    An example might be along the lines of:

    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()
    
    0 讨论(0)
提交回复
热议问题