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.

El bucle while debería estar rompiendo, pero continúa.

Estoy ejecutando un bucle que realiza la tarea hasta cierto punto, se detiene por unos segundos y luego continúa. Si ejecuto este código, esperaría que el bucle se detenga cuando se establezca b en 1 y llame a la función de espera, pero de alguna manera no se detiene. Si elimino la llamada a la función después del bucle while, se detiene como se espera. ¿Qué está pasando aquí?

import threading

def wait():
    timer = threading.Timer(5, run())
    timer.start()

def run():
    a = 1
    b = 2

    while a < 100 and b == 2:
        a = a + 1
        print(a)

        if a > 57:
            b = 1

    wait()

if __name__ == '__main__':
    run()
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Hay algunos problemas con el código proporcionado.

    En primer lugar, la llamada a la función dentro del constructor de Timer no debe tener paréntesis, es decir, timer = threading.Timer(5,run) en lugar de timer = threading.Timer(5,run()).

    En segundo lugar, la función wait() se está llamando dentro de la función run() después del bucle while, cuando debería llamarse dentro de la declaración if que verifica si b es igual a 1.

    La razón por la que el bucle no se detiene cuando b es igual a 1 es porque se llama a la función wait() independientemente del valor de b.

    Para solucionar este problema, mueve la llamada a la función wait() dentro de la declaración if que verifica si b es igual a 1, de la siguiente manera:

    def run():
        a = 1      
        b = 2
    
        while a < 100 and b == 2:
            a += 1 
            print(a)
    
            if a > 57:
                b = 1
                wait()  # mueve la llamada a la función wait() aquí
    

    De esta manera, la función wait() solo se llamará cuando b sea igual a 1, permitiendo que el bucle se rompa y espere 5 segundos antes de continuar.

Comments are closed.