Otra cláusula en Python mientras statement

He notado que el siguiente código es legal en Python. Mi pregunta es ¿por qué? Hay una razón específica?

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

Related of "Otra cláusula en Python mientras statement"

La cláusula else solo se ejecuta cuando su condición while se vuelve falsa. Si sale del bucle, o si se produce una excepción, no se ejecutará.

Una forma de pensarlo es como una construcción if / else con respecto a la condición:

 if condition: handle_true() else: handle_false() 

es análogo a la construcción en bucle:

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

Un ejemplo podría estar en la línea de:

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

La cláusula else se ejecuta si sale de un bloque normalmente, al golpear la condición de bucle o al caer de la parte inferior de un bloque try. No se ejecuta si break o return de un bloque, o si genera una excepción. Funciona no solo para el tiempo y para los bucles, sino también para los bloques de prueba.

Por lo general, lo encuentra en lugares donde normalmente saldría temprano de un bucle, y correr fuera del final del bucle es una ocasión inesperada / inusual. Por ejemplo, si recorres una lista en busca de un valor:

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

En respuesta a Is there a specific reason? Aquí hay una aplicación interesante: salir de múltiples niveles de bucle.

Así es como funciona: el bucle externo tiene una ruptura al final, por lo que solo se ejecutará una vez. Sin embargo, si el bucle interno se completa (no encuentra divisor), entonces llega a la sentencia else y nunca se alcanza la ruptura externa. De esta manera, una ruptura en el bucle interno saldrá de ambos bucles, en lugar de solo uno.

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

Tanto para while como for loops, la instrucción else se ejecuta al final, a menos que se haya utilizado break .

En la mayoría de los casos, hay mejores maneras de hacerlo (envolviéndolo en una función o generando una excepción), ¡pero esto funciona!

La cláusula else se ejecuta cuando la condición while se evalúa como falsa.

De la documentación :

La instrucción while se usa para la ejecución repetida siempre que una expresión sea verdadera:

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

Esto prueba repetidamente la expresión y, si es verdadera, ejecuta la primera suite; si la expresión es falsa (que puede ser la primera vez que se prueba), se ejecuta el conjunto de la cláusula else , si está presente, y el bucle termina.

Una sentencia de break ejecutada en la primera suite termina el bucle sin ejecutar la suite de la cláusula else . Una instrucción de continue ejecutada en el primer conjunto omite el rest del conjunto y vuelve a probar la expresión.

Mi respuesta se centrará en CUÁNDO podemos usar while / for-else.

A primera vista, parece que no hay diferencia cuando se usa

 while CONDITION: EXPRESSIONS print 'ELSE' print 'The next statement' 

y

 while CONDITION: EXPRESSIONS else: print 'ELSE' print 'The next statement' 

Debido a que la statement de print 'ELSE' parece ejecutarse siempre en ambos casos (tanto cuando el ciclo while terminó como cuando no se ejecutó).

Entonces, solo será diferente cuando no se ejecute la statement print 'ELSE' . Es cuando hay una break dentro del bloque de código debajo de

 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 

Si difieren a:

 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 no está en esta categoría, porque hace el mismo efecto para los dos casos anteriores.

el aumento de excepción tampoco causa diferencia, porque cuando se eleva, donde el siguiente código se ejecutará es en el controlador de excepciones (excepto el bloque), el código en la cláusula else o justo después de la cláusula while no se ejecutará.

Es útil para la interacción social.

 while (Date != "January 1st"): time.sleep(1) else: print("Happy new year!") 

La instrucción else: se ejecuta cuando y solo cuando el bucle while ya no cumple su condición (en su ejemplo, cuando n != 0 es falso).

Así que la salida sería esta:

 5 4 3 2 1 what the... 

El mejor uso de ‘while: else:’ en Python debería ser si no se ejecuta ningún bucle en ‘while’ y se ejecuta la instrucción ‘else’. La forma en que funciona hoy no tiene sentido porque puede usar el siguiente código con los mismos resultados …

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