¿Qué tipo de métodos existen para salir prematuramente de una if
cláusula?
Hay momentos en los que estoy escribiendo código y quiero poner una break
declaración dentro de una if
cláusula, solo para recordar que solo se pueden usar para bucles.
Tomemos el siguiente código como ejemplo:
if some_condition:
...
if condition_a:
# do something
# and then exit the outer if block
...
if condition_b:
# do something
# and then exit the outer if block
# more code here
Puedo pensar en una forma de hacer esto: suponiendo que los casos de salida sucedan dentro de las declaraciones if anidadas, envuelva el código restante en un gran bloque else. Ejemplo:
if some_condition:
...
if condition_a:
# do something
# and then exit the outer if block
else:
...
if condition_b:
# do something
# and then exit the outer if block
else:
# more code here
El problema con esto es que más ubicaciones de salida significan más código anidado / sangrado.
Alternativamente, podría escribir mi código para que las if
cláusulas sean lo más pequeñas posible y no requieran ninguna salida.
¿Alguien sabe de una buena / mejor manera de salir de una if
cláusula?
Si hay cláusulas else-if y else asociadas, me imagino que al salir se omitirían.
fuente
elif
?if a: #stuff; #stuff_inbetween; if b: #stuff;
el código intermedio depende denot a
pero no depende deb
.elif
stackoverflow.com/a/2069680/7045119Respuestas:
(Este método funciona para
if
s, múltiples bucles anidados y otras construcciones de las que no se puedebreak
fácilmente).Envuelve el código en su propia función. En lugar de
break
, utilicereturn
.Ejemplo:
fuente
(En realidad, no uses esto, por favor).
fuente
goto
.fuente
while True:
. ¡Solo asegúrate de poner unabreak
declaración al final! Para lenguajes con la construcción do-while, es más idomático hacer:do { code that can conditionally break out } while (false);
Puede emular la funcionalidad de goto con excepciones:
Descargo de responsabilidad: solo quiero llamar su atención sobre la posibilidad de hacer las cosas de esta manera, mientras que de ninguna manera lo apoyo como razonable en circunstancias normales. Como mencioné en un comentario sobre la pregunta, es preferible estructurar el código para evitar los condicionales bizantinos en primer lugar. :-)
fuente
¿tal vez esto?
fuente
elif
quedó en blanco mientras escribía esto. Aunque creo que esto no funcionaría en una situación en la que quiero que el código se ejecute entre las declaraciones if anidadas.Para lo que realmente se preguntó, mi enfoque es poner esos
if
s dentro de un bucle de un buclePruébalo:
fuente
for _ in range(1):
lugar dewhile True:
. (1) Comunique mejor su intención de un solo bucle de iteración y (2) ninguna declaración de última interrupción para salir del bucle (podría eliminarse por accidente más adelante)En general, no lo hagas. Si está anidando "si" y rompiendo con ellos, lo está haciendo mal.
Sin embargo, si debe:
Tenga en cuenta que las funciones no TIENEN que ser declaradas en la instrucción if, se pueden declarar por adelantado;) Esta sería una mejor opción, ya que evitará la necesidad de refactorizar un if / then feo más adelante.
fuente
if condition_a
y estabaif condition_b
anidado dentro de un archivoif some_condition
. Quiero poder salirme delif some_condition
.Efectivamente, lo que está describiendo son declaraciones goto, que generalmente se analizan con bastante frecuencia. Su segundo ejemplo es mucho más fácil de entender.
Sin embargo, aún más limpio sería:
fuente
Hay otra forma que no se basa en la definición de funciones (porque a veces es menos legible para fragmentos de código pequeños), no usa un bucle while externo adicional (que podría necesitar una apreciación especial en los comentarios para incluso ser comprensible a primera vista) , no usa goto (...) y lo más importante es que mantenga su nivel de sangría para el exterior si es así, no tiene que comenzar a anidar cosas.
Sí, eso también necesita una segunda mirada para la legibilidad, sin embargo, si los fragmentos de código son pequeños, no es necesario realizar un seguimiento de los bucles while que nunca se repetirán y, después de comprender para qué sirven los if intermedios, es fácilmente legible, todo en un lugar y con la misma sangría.
Y debería ser bastante eficiente.
fuente
Entonces, entiendo que estás tratando de salir del bloque de código if externo
Una forma de salir de esto es que puede probar una condición falsa en el bloque if externo, que luego saldrá implícitamente del bloque de código, luego use un bloque else para anidar los otros ifs para hacer algo
fuente
Lo único que aplicaría esto sin métodos adicionales es
elif
el siguiente ejemplofuente
Aquí hay otra forma de manejar esto. Utiliza un solo elemento para bucle que le permite usar continuar. Evita la necesidad innecesaria de tener funciones adicionales sin ningún motivo. Y, además, elimina los posibles bucles while infinitos.
fuente
use
return
en la condición if lo devolverá de la función, de modo que pueda usar return para romper la condición if.fuente