Sentencia de bucle while, break y continue

Puede hacer que un bloque de código se ejecute una y otra vez utilizando una sentencia while. El código de una cláusula while se ejecutará mientras la condición de la sentencia while sea True. En el código, una sentencia while siempre consiste en lo siguiente:

  • La palabra clave while
  • Una condición (es decir, una expresión que se evalúa como True o False)
  • Dos puntos
  • A partir de la siguiente línea, un bloque de código con sangría (llamado cláusula while)

Puede ver que una sentencia while es similar a una sentencia if. La diferencia está en cómo se comportan. Al final de una cláusula if, la ejecución del programa continúa después de la sentencia if. Pero al final de una cláusula while, la ejecución del programa salta de nuevo al inicio de la sentencia while. La cláusula while suele llamarse bucle while o simplemente bucle.

Veamos una sentencia if y un bucle while que usan la misma condición y toman las mismas acciones basadas en esa condición. Aquí está el código con una sentencia if:

spam = 0
if spam < 5:
    print('Hello, world.')
    spam = spam + 1

Este es el código con una sentencia while:

spam = 0
while spam < 5:
    print('Hello, world.')
    spam = spam + 1

Estas sentencias son similares: tanto if como while comprueban el valor de spam, y si es menor que 5, imprimen un mensaje. Pero cuando ejecutas estos dos fragmentos de código, ocurre algo muy diferente en cada uno de ellos. Para la sentencia if, la salida es simplemente Hello, world., Pero para la sentencia while, es Hello, world. repetido cinco veces. Echa un vistazo a los diagramas de flujo de estos dos trozos de código.

Diagrama de flujo del código de la sentencia if
Diagrama de flujo del código de la sentencia while

El código con la sentencia if comprueba la condición, e imprime Hello, world. sólo una vez si esa condición es True. El código con el bucle while, por otro lado, lo imprimirá cinco veces. El bucle se detiene después de cinco impresiones porque el entero de spam aumenta en uno al final de cada iteración del bucle, lo que significa que el bucle se ejecutará cinco veces antes de que spam < 5 sea False.

En el bucle while, la condición se comprueba siempre al principio de cada iteración (es decir, cada vez que se ejecuta el bucle). Si la condición es True, entonces la cláusula se ejecuta, y después, la condición se comprueba de nuevo. La primera vez que la condición es False, se salta la cláusula while (se detiene el bucle y el programa continua su ejecución).

Un molesto bucle while

He aquí un pequeño programa de ejemplo con el bucle while que le pedirá que escriba, literalmente, su nombre. Abra un nuevo archivo en el editor de archivos, introduce el siguiente código y guarda el archivo como yourName.py (T-T):

➊ name = ''
➋ while name != 'your name':
       print('Please type your name.')
    ➌ name = input()
➍ print('Thank you!')

Puedes ver la ejecución de este programa en https://autbor.com/yourname/. En primer lugar, el programa establece la variable name ➊ a una cadena vacía. Esto es para que la condición name != 'your name' se evalúe como True y la ejecución del programa entre en la cláusula del bucle while ➋.

El código dentro de esta cláusula pide al usuario que escriba su nombre (name), que se asigna a la variable name ➌. Como esta es la última línea del bloque, la ejecución vuelve al inicio del bucle while y reevalúa la condición. Si el valor en nombre no es igual a la cadena 'your name', entonces la condición es True, y la ejecución entra de nuevo en la cláusula while.

Pero una vez que el usuario escribe su nombre, la condición del bucle while será 'your name' != 'your name', que se evalúa como False. La condición es ahora False, y en lugar de que la ejecución del programa vuelva a entrar en la cláusula del bucle while, Python se salta la misma y continúa ejecutando el resto del programa ➍. Diagrama de flujo para el programa yourName.py.

Diagrama de flujo del programa yourName.py

Ahora, veamos yourName.py en acción. ejecutarlo, e introduce algo que no sea tu nombre unas cuantas veces antes de darle al programa lo que quiere.

Please type your name.
Al
Please type your name.
Albert
Please type your name.
%#@#%*(^&!!!
Please type your name.
your name
Thank you!

Si nunca introduce su nombre, la condición del bucle while nunca será False, y el programa seguirá preguntando siempre. Aquí, la llamada a input() permite al usuario introducir la cadena correcta para que el programa siga adelante. En otros programas, la condición podría no cambiar nunca, y eso puede ser un problema. Veamos cómo se puede salir de un bucle while.

Declaración break

Existe un atajo para conseguir que la ejecución del programa salga antes de la cláusula de un bucle while. Si la ejecución alcanza una sentencia break, sale inmediatamente de la cláusula del bucle while. En código, una sentencia break simplemente contiene la palabra clave break.

Bastante sencillo, ¿verdad? Aquí hay un programa que hace lo mismo que el programa anterior, pero utiliza una sentencia break para escapar del bucle. Introduce el siguiente código, y guarda el archivo como yourName2.py:

➊ while True:
       print('Please type your name.')
    ➋ name = input()
    ➌ if name == 'your name':
        ➍ break
➎ print('Thank you!')

Puedes ver la ejecución de este programa en https://autbor.com/yourname2/. La primera línea ➊ crea un bucle infinito; es un bucle while cuya condición es siempre True. (La expresión True, después de todo, siempre se evalúa al valor True.) Después de que la ejecución del programa entre en este bucle, saldrá del mismo sólo cuando se ejecute una sentencia break. (Un bucle infinito que nunca finaliza es un error de programación común).

Al igual que antes, este programa pide al usuario que introduzca su nombre ➋. Ahora, sin embargo, mientras la ejecución sigue dentro del bucle while, una sentencia if comprueba ➌ si nombre es igual a 'your name'. Si esta condición es True, se ejecuta la sentencia break ➍, y la ejecución sale del bucle para print('Thank you!') ➎. En caso contrario, se salta la cláusula de la sentencia if que contiene la sentencia break, lo que sitúa la ejecución al final del bucle while. En este punto, la ejecución del programa salta de nuevo al inicio de la sentencia while ➊ para volver a comprobar la condición. Como esta condición es simplemente el valor booleano True, la ejecución entra en el bucle para pedir al usuario que escriba su nombre de nuevo. Vea en la el diagrama de flujo de este programa.

Ejecute yourName2.py, e introduzca el mismo texto que introdujo para yourName.py. El programa reescrito debería responder de la misma manera que el original.

El diagrama de flujo del programa yourName.py con un bucle infinito. Observa que la ruta X lógicamente nunca ocurrirá, porque la condición del bucle es siempre True.

Sentencia continue

Al igual que la sentencia break, la sentencia continue se utilizan dentro de los bucles. Cuando la ejecución del programa alcanza una sentencia continue, la ejecución del programa salta inmediatamente al inicio del bucle y reevalúa la condición del bucle. (Esto es también lo que ocurre cuando la ejecución llega al final del bucle).

Utilicemos continue para escribir un programa que pida un nombre y una contraseña. Introduce el siguiente código en una nueva ventana del editor de archivos y guarda el programa como swordfish.py.

while True:
      print('Who are you?')
      name = input()
    ➊ if name != 'Joe':
        ➋ continue
       print('Hello, Joe. What is the password? (It is a fish.)')
    ➌ password = input()
       if password == 'swordfish':
        ➍ break
➎ print('Access granted.')    

Si el usuario introduce cualquier nombre que no sea Joe ➊, la sentencia continue ➋ hace que la ejecución del programa salte de nuevo al inicio del bucle. Cuando el programa reevalúa la condición, la ejecución siempre entrará en el bucle, ya que la condición es simplemente el valor True. Una vez que el usuario consigue pasar esa sentencia if, se le pide una contraseña (password) ➌. Si la contraseña introducida es swordfish, entonces se ejecuta la sentencia break ➍, y la ejecución salta fuera del bucle while para imprimir Access granted. ➎. En caso contrario, la ejecución continúa hasta el final del bucle while, donde salta de nuevo al inicio del bucle. Ver el diagrama de flujo de este programa.

Diagrama de flujo de swordfish.py. La ruta X lógicamente nunca ocurrirá, porque la condición del bucle es siempre True

Ejecuta este programa y dale alguna entrada. Hasta que no digas que eres Joe, el programa no debería pedirte una contraseña (password), y una vez que introduzcas la contraseña correcta, debería salir.

Who are you?
 I'm fine, thanks. Who are you?
 Who are you?
 Joe
 Hello, Joe. What is the password? (It is a fish.)
 Mary
 Who are you?
 Joe
 Hello, Joe. What is the password? (It is a fish.)
 swordfish
 Access granted.

Valores Truthy y Falsey

Las condiciones considerarán algunos valores de otros tipos de datos equivalentes a True y False. Cuando se usan en condiciones, 0, 0.0, y '' (la cadena vacía) se consideran False, mientras que todos los demás valores se consideran True. Por ejemplo, observe el siguiente programa:

name = ''
➊ while not name:
    print('Enter your name:')
    name = input()
print('How many guests will you have?')
numOfGuests = int(input())
➋ if numOfGuests:
    ➌ print('Be sure to have enough room for all your guests.')
print('Done')

Puede ver la ejecución de este programa en https://autbor.com/howmanyguests/. Si el usuario introduce una cadena en blanco para el name, entonces la condición de la sentencia while será True ➊, y el programa continúa pidiendo un name. Si el valor de numOfGuests no es 0 ➋, entonces la condición se considera True, y el programa imprimirá un recordatorio para el usuario ➌.

Podrías haber introducido not name != '' en lugar de not name, y numOfGuests != 0 en lugar de numOfGuests, pero el uso de los valores truthy y falsey puede hacer que tu código sea más fácil de leer.

Puedes ver la ejecución de este programa en https://autbor.com/hellojoe/.

Cómo detener un bucle while infinito

Si alguna vez ejecutas un programa que tiene un error que hace que se quede atrapado en un bucle infinito, pulsa CTRL-C. Esto enviará un error KeyboardInterrupt a su programa y hará que se detenga inmediatamente. Intente detener un programa creando un simple bucle infinito en el editor de archivos, y guarde el programa como infiniteLoop.py.

while True:
    print('Hello, world!')

Cuando ejecutes este programa, imprimirá Hello, world! en la pantalla para siempre porque la condición de la sentencia while es siempre True. CTRL-C también es útil si quieres simplemente terminar tu programa inmediatamente, incluso si no está atascado en un bucle infinito.

Deja una respuesta