Solución:
La condición de la while
El bucle solo se verifica entre iteraciones del cuerpo del bucle, por lo que si cambia la condición en el medio del bucle, la iteración actual terminará antes de que termine el bucle. Si quieres romper un bucle inmediatamente, necesitas cualquiera break
(que rompe automáticamente el ciclo independientemente de la condición) o continue
(que salta a la siguiente iteración y, por lo tanto, terminará el ciclo si la condición ya no es cierta).
Utilizando while True:
con un break
Cuando desea detener el bucle, generalmente es mucho más sencillo que tratar de controlar el bucle configurando y desarmando una bandera.
FWIW, en lugar de copiar y pegar el código para ingresar los dos números, y tener dos formas diferentes de salir del bucle, podría poner todo eso en una función y romper el bucle con un Exception
, como esto:
print("Enter two numbers and I will tell you the sum of the numbers.")
print("Press 'q' at anytime to exit.")
def input_number(prompt: str) -> int:
"""Ask the user to input a number, re-prompting on invalid input.
Exception: raise EOFError if the user enters 'q'."""
while True:
try:
number = input(f"{prompt} number: ")
if number == 'q':
raise EOFError
return int(number)
except ValueError:
print("Please enter a number!")
while True:
try:
numbers = (input_number(n) for n in ("First", "Second"))
print(f"The answer is: {sum(numbers)}")
except EOFError:
break
Esto hace que sea más fácil extender el programa para manejar más de dos entradas; intente agregar un “Tercero” después de donde dice “Primero” y “Segundo”. 🙂
Una vez que ejecute el programa y escriba “q”, sí, de hecho keep_going
se establecerá en False
pero NO QUIERE DECIR ya romperá el bucle, solo hará que el keep_going
ser igual a False
así en el SIGUIENTE ITERACIÓN detendrá el bucle. ¿Porqué es eso? porque seria asi while keep_going:
-> while False:
así que ya que no es True
por lo tanto, ya no se ejecuta el programa.
Ahora basado en tu objetivo como mencionaste. Puede hacerlo de esta manera donde puede agregar el break
.
if first_number == 'q':
keep_going = False
break
# Prompt for user to input second number and store it in a variable.
second_number = input("Second number: ")
# Create a break when entering the second number.
if second_number == 'q':
keep_going = False
break
También me gustaría sugerir que lo haga de esta manera, es más específico en términos de lo que sucederá en el código, pero por supuesto, depende de usted.
first_number = input("First number: ")
# Create a break when entering the first number.
if first_number == 'q':
keep_going = False
break
# Prompt for user to input second number and store it in a variable.
# Create a break when entering the second number.
else:
second_number = input("Second number: ")
if second_number =='q':
keep_going = False
break
Los bucles while se ejecutan hasta que su condición dada es falsa. Un ciclo sólo comprobará su condición cuando sea necesario (la ejecución del programa se mueve a la parte superior del ciclo). En casi todos los casos, esto ocurre cuando se ha ejecutado todo el cuerpo del bucle. Mira aquí:
keep_going = True
while keep_going:
keep_going = False
# keep_going is False, but this will still print once
# because the loop has not checked its condition again.
print("Will execute once")
“Se ejecutará una vez” imprime una sola vez incluso después keep_going
está configurado en False. Esto sucede porque el bucle while no vuelve a comprobar su condición hasta que se ha ejecutado todo su cuerpo.
Sin embargo, break
las declaraciones son diferentes. A break
La declaración causará que un bucle salga inmediatamente sin importar qué.
keep_going = True
while keep_going:
break # Exits the while loop immediately. The condition is not checked.
print("Will never print")
Aquí, no se imprime nada aunque keep_going
es True
todo el tiempo. break
hizo que el bucle saliera independientemente de la condición.
A continue
Esta sentencia moverá la ejecución del programa al inicio del ciclo y hará que su condición sea revisada nuevamente.
En este ejemplo, continue
envía la ejecución del programa al inicio del ciclo. Ya que keep_going
estaba configurado para False
, no se imprimirá nada porque el ciclo while saldrá después de darse cuenta de que su condición se evalúa como falsa.
keep_going = True
while keep_going:
keep_going = False
continue
print("Will never print")