while simbolos significa sentencias relacionales que operadores else ejemplos bucles python control-flow

significa - simbolos en python



Cómo salir de una cláusula if (9)

¿Qué tipo de métodos existen para salir prematuramente de una cláusula if ?

Hay momentos en los que escribo código y quiero poner una declaración break dentro de una cláusula if , solo para recordar que esos 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 suceden dentro de sentencias if anidadas, ajuste 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 de anidamiento / sangría.

Alternativamente, podría escribir mi código para que las cláusulas if sean lo más pequeñas posibles y no requiera ninguna salida.

¿Alguien sabe de una buena / mejor manera de salir de una cláusula if ?

Si hay alguna cláusula else-if y else asociada, supongo que al salir se saltearían sobre ellas.


¿tal vez esto?

if some_condition and condition_a: # do something elif some_condition and condition_b: # do something # and then exit the outer if block elif some_condition and not condition_b: # more code here else: #blah if


(Este método funciona para s, múltiples bucles anidados y otras construcciones de las que no se puede break fácilmente).

Envuelva el código en su propia función. En lugar de break , usa return .

Ejemplo:

def some_function(): if condition_a: # do something and return early ... return ... if condition_b: # do something else and return early ... return ... return if outer_condition: ... some_function() ...


Así que aquí entiendo que estás tratando de salir del bloque de código externo si

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

Una forma de salir de esto es que puede probar una condición falsa en el bloque exterior if, que luego saldrá implícitamente del bloque de código, luego usará un bloque else para anidar los otros ifs para hacer algo

if test_for_false: # Exit the code(which is the outer if code) else: if condition_a: # Do something if condition_b: # Do something


Efectivamente, lo que estás describiendo son declaraciones goto, que generalmente se critican bastante. Tu segundo ejemplo es mucho más fácil de entender.

Sin embargo, aún más limpio sería:

if some_condition: ... if condition_a: your_function1() else: your_function2() ... def your_function2(): if condition_b: # do something # and then exit the outer if block else: # more code here


En términos generales, no lo hagas. Si está anidando "ifs" y rompiendo con ellos, lo está haciendo mal.

Sin embargo, si debe:

if condition_a: def condition_a_fun(): do_stuff() if we_wanna_escape: return condition_a_fun() if condition_b: def condition_b_fun(): do_more_stuff() if we_wanna_get_out_again: return condition_b_fun()

Tenga en cuenta que las funciones NO TIENEN que declararse en la instrucción if, pueden declararse de antemano;) Esta sería una mejor opción, ya que evitará la necesidad de refactorizar un feo si / luego más adelante.


Para lo que realmente se preguntó, mi enfoque es poner esos if dentro de un bucle de un solo bucle

while (True): if (some_condition): ... if (condition_a): # do something # and then exit the outer if block break ... if (condition_b): # do something # and then exit the outer if block break # more code here # make sure it is looped once break

Pruébalo:

conditions = [True,False] some_condition = True for condition_a in conditions: for condition_b in conditions: print("/n") print("with condition_a", condition_a) print("with condition_b", condition_b) while (True): if (some_condition): print("checkpoint 1") if (condition_a): # do something # and then exit the outer if block print("checkpoint 2") break print ("checkpoint 3") if (condition_b): # do something # and then exit the outer if block print("checkpoint 4") break print ("checkpoint 5") # more code here # make sure it is looped once break


Puede emular la funcionalidad de goto con excepciones:

try: # blah, blah ... # raise MyFunkyException as soon as you want out except MyFunkyException: pass

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 respaldo como razonable en circunstancias normales. Como mencioné en un comentario sobre la pregunta, es preferible, con mucho, el código de estructuración para evitar los condicionales bizantinos. :-)


from goto import goto, label if some_condition: ... if condition_a: # do something # and then exit the outer if block goto .end ... if condition_b: # do something # and then exit the outer if block goto .end # more code here label .end

(No use esto, por favor)


while some_condition: ... if condition_a: # do something break ... if condition_b: # do something break # more code here break