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..."
elsepara este uso había sido una muy mala idea, y que no harían más de esto.after:.Respuestas:
La
elsecláusula solo se ejecuta cuando suwhilecondición se vuelve falsa. Si sebreaksale 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 {} somethingexcepto quesomethingse omitirá si estásbreaken elwhilebucle.La
elseclá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 sibreakoreturnfuera 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=Falseal comienzo de un bucle, y luego hago un chequeofound_ital 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
whileyforbucles, laelsedeclaración se ejecuta al final, a menos quebreakse 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 elwhileciclo finalizó o no se ejecutó).Entonces, solo es diferente cuando la declaración
print 'ELSE'no se ejecutará. Es cuando hay unbreakbloque de código dentro dewhileSi difiere de:
returnno 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
elsecláusula o justo después de lawhilecláusula no se ejecutará.fuente
Sé que esta es una pregunta vieja pero ...
Como dijo Raymond Hettinger, debería llamarse en
while/no_breaklugar 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
elsey deshacernos de esa comprobación.Siempre lo leo
while/no_breakpara 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 < 5nunca se convirtió en falso, porquei == 3rompe el bucle, por lo demás-cláusula no se ha ejecutado.SALIDA:
Ejemplo 3: El mientras que la condición
i < 5se convirtió en falso cuandoifue5, 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 != 0es 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
elsebloque no se ejecutará si está dejando de usar el buclebreako lareturnpalabra clave. En su ejemplo,printse ejecutará también si el ciclo ha finalizado con elbreakcomando.Es útil para la interacción social.
fuente
elseaquí? El código hace exactamente lo mismo sin él.breakdurante su cuenta regresiva, no usarloelsele hará decir "¡Feliz año nuevo!" al instante, lo que no tiene ningún sentido.break"? No haybreaken el código.