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..."
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..."
else
para este uso había sido una muy mala idea, y que no harían más de esto.after:
.Respuestas:
La
else
cláusula solo se ejecuta cuando suwhile
condición se vuelve falsa. Si sebreak
sale del ciclo o si se genera una excepción, no se ejecutará.Una forma de pensarlo es como una construcción if / else con respecto a la condición:
es análogo a la construcción de bucle:
Un ejemplo podría ser lo siguiente:
fuente
while {} something
excepto quesomething
se omitirá si estásbreak
en elwhile
bucle.La
else
cláusula se ejecuta si sale de un bloque normalmente, golpeando la condición del bucle o cayendo del fondo de un bloque try. Se no se ejecuta sibreak
oreturn
fuera de un bloque, o lanzar una excepción. Funciona no solo para while y para bucles, sino también para probar bloques.Por lo general, lo encuentra en lugares donde normalmente saldría de un bucle temprano, y salir corriendo al final del bucle es una ocasión inesperada / inusual. Por ejemplo, si está recorriendo una lista buscando un valor:
fuente
found_it=False
al comienzo de un bucle, y luego hago un chequeofound_it
al finalEn respuesta a
Is there a specific reason?
, aquí hay una aplicación interesante: romper múltiples niveles de bucles.Así es como funciona: el bucle externo tiene un descanso al final, por lo que solo se ejecutará una vez. Sin embargo, si el ciclo interno se completa (no encuentra divisor), entonces alcanza la instrucción else y nunca se alcanza la ruptura externa. De esta manera, una ruptura en el bucle interno saldrá de ambos bucles, en lugar de uno solo.
Para ambos
while
yfor
bucles, laelse
declaración se ejecuta al final, a menos quebreak
se haya utilizado.En la mayoría de los casos, hay mejores formas de hacerlo (envolviéndolo en una función o generando una excepción), ¡pero esto funciona!
fuente
La cláusula else se ejecuta cuando la condición while se evalúa como falsa.
De la documentación :
fuente
Mi respuesta se centrará en CUÁNDO podemos usar while / for-else.
A primera vista, parece que no hay diferencia cuando se usa
y
Porque la
print 'ELSE'
declaración parece siempre ejecutada en ambos casos (ambos cuando elwhile
ciclo finalizó o no se ejecutó).Entonces, solo es diferente cuando la declaración
print 'ELSE'
no se ejecutará. Es cuando hay unbreak
bloque de código dentro dewhile
Si difiere de:
return
no está en esta categoría, porque tiene el mismo efecto para los dos casos anteriores.el aumento de excepción tampoco causa diferencia, porque cuando aumenta, donde se ejecutará el siguiente código está en el controlador de excepción (excepto el bloque), el código en la
else
cláusula o justo después de lawhile
cláusula no se ejecutará.fuente
Sé que esta es una pregunta vieja pero ...
Como dijo Raymond Hettinger, debería llamarse en
while/no_break
lugar dewhile/else
.Me resulta fácil entender y si nos fijamos en este fragmento.
Ahora, en lugar de verificar la condición después del ciclo while, podemos intercambiarlo
else
y deshacernos de esa comprobación.Siempre lo leo
while/no_break
para entender el código y esa sintaxis tiene mucho más sentido para mí.fuente
La cláusula else solo se ejecuta cuando la condición while se vuelve falsa.
Aquí hay unos ejemplos:
Ejemplo 1: Inicialmente, la condición es falsa, por lo que se ejecuta la cláusula else .
SALIDA:
Ejemplo 2: El mientras condición
i < 5
nunca se convirtió en falso, porquei == 3
rompe el bucle, por lo demás-cláusula no se ha ejecutado.SALIDA:
Ejemplo 3: El mientras que la condición
i < 5
se convirtió en falso cuandoi
fue5
, por lo demás-cláusula fue ejecutado.SALIDA:
fuente
La
else:
instrucción se ejecuta cuando y solo cuando el ciclo while ya no cumple su condición (en su ejemplo, cuandon != 0
es falso).Entonces la salida sería esta:
fuente
El otro se ejecuta si el bucle while no se rompió.
Me gusta pensar en ello con una metáfora de "corredor".
El "más" es como cruzar la línea de meta, sin importar si comenzó al principio o al final de la pista. "else" solo no se ejecuta si se interrumpe en algún punto intermedio.
Los principales casos de uso son el uso de esta ruptura de bucles anidados o si desea ejecutar algunas declaraciones solo si el bucle no se rompió en alguna parte (piense en romper como una situación inusual).
Por ejemplo, el siguiente es un mecanismo sobre cómo salir de un bucle interno sin usar variables o try / catch:
fuente
El mejor uso de la construcción 'while: else:' en Python debería ser si no se ejecuta ningún ciclo en 'while', entonces 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 ...
fuente
else
bloque no se ejecutará si está dejando de usar el buclebreak
o lareturn
palabra clave. En su ejemplo,print
se ejecutará también si el ciclo ha finalizado con elbreak
comando.Es útil para la interacción social.
fuente
else
aquí? El código hace exactamente lo mismo sin él.break
durante su cuenta regresiva, no usarloelse
le hará decir "¡Feliz año nuevo!" al instante, lo que no tiene ningún sentido.break
"? No haybreak
en el código.