es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo continuar un bucle desde dentro de una función?

Considere lo siguiente:

for i in range(100):
    if cond1:
        cleanup()
        continue
    if cond2:
        cleanup()
        continue
    if cond3:
        cleanup()
        continue
    ...
do_work()

Me preguntaba si hay alguna manera de escribir esta construcción de una manera más concisa, de modo que al menos no haya un fragmento duplicado de cleanup(); continue.

Es casi como si quisiera un goto dentro de la función cleanup para volver al principio del bucle, o para insertar el continue en la función cleanup.

¿Hay alguna forma de hacer algo así?


EDIT con un ejemplo más elaborado:

for i in range(100):
    if a == 1:
        cleanup()
        continue
    b = input()
    if a + b == 2:
        cleanup()
        continue
    c = input()
    if a + b + c:
        cleanup()
        continue
    ...
do_work()

Notará que quiero que cada condición detenga o continúe la iteración, lo cual no se puede hacer con or. Incluso si se pudiera, esto hace que la lectura del código sea mucho más sencilla y lineal.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Una forma de escribir esta construcción de una manera más concisa sería utilizar una función para manejar las declaraciones de limpieza y de continuar. Por ejemplo:

    def verificar_y_continuar():
        limpiar()
        return True
    
    for i in range(100):
        if cond1 or cond2 or cond3:
            if verificar_y_continuar():
                continue
        hacer_trabajo()
    

    De esta manera, la función verificar_y_continuar maneja la limpieza y devuelve True si se cumplen alguna de las condiciones, lo que hace que el bucle continue. El bucle solo continúa hacia hacer_trabajo si ninguna de las condiciones se cumple.

    En el ejemplo editado donde cada condición debe detener o continuar la iteración, se puede tomar un enfoque similar utilizando una función para manejar el valor de retorno y la declaración de continuar:

    def verificar_y_retornar(valor):
        limpiar()
        return valor
    
    for i in range(100):
        a = input()
        if verificar_y_retornar(a == 1):
            continue
        b = input()
        if verificar_y_retornar(a + b == 2):
            continue
        c = input()
        if verificar_y_retornar(a + b + c):
            continue
        hacer_trabajo()
    

    En este caso, verificar_y_retornar maneja la limpieza y devuelve el valor booleano de la condición, lo que nuevamente hace que el bucle continue si es True.

Comments are closed.