Link Search Menu Expand Document

Bucles while

Anteriormente hemos visto el uso del if y el for para modificar el flujo de ejecuci贸n del c贸digo. A continuaci贸n vemos otra forma de hacerlo con el while.

While

El uso del while nos permite ejecutar una secci贸n de c贸digo repetidas veces, de ah铆 su nombre. El c贸digo se ejecutar谩 mientras una condici贸n determinada se cumpla. Cuando se deje de cumplir, se saldr谩 del bucle y se continuar谩 la ejecuci贸n normal. Llamaremos iteraci贸n a una ejecuci贸n completa del bloque de c贸digo.

Cabe destacar que existe dos tipos de bucles, los que tienen un n煤mero de iteraciones no definidas, y los que tienen un n煤mero de iteraciones definidas. El while estar铆a dentro del primer tipo. Mas adelante veremos los for, que se engloban en el segundo.

x = 5
while x > 0:
    x -=1
    print(x)

# Salida: 4,3,2,1,0

En el ejemplo anterior tenemos un caso sencillo de while. Tenemos una condici贸n x>0 y un bloque de c贸digo a ejecutar mientras dure esa condici贸n x-=1 y print(x). Por lo tanto mientras que x sea mayor que 0, se ejecutar谩 el c贸digo. Una vez se llega al final, se vuelve a empezar y si la condici贸n se cumple, se ejecuta otra vez. En este caso se entra al bloque de c贸digo 5 veces, hasta que en la sexta, x vale cero y por lo tanto la condici贸n ya no se cumple. Por lo tanto el while tiene dos partes:

  • La condici贸n que se tiene que cumplir para que se ejecute el c贸digo.
  • El bloque de c贸digo que se ejecutar谩 mientras la condici贸n se cumpla.

Ten cuidado ya que un mal uso del while puede dar lugar a bucles infinitos y problemas. Cierto es que en alg煤n caso tal vez nos interese tener un bucle infinito, pero salvo que estemos seguros de lo que estamos haciendo, hay que tener cuidado. Imaginemos que tenemos un bucle cuya condici贸n siempre se cumple. Por ejemplo, si ponemos True en la condici贸n del while, siempre que se eval煤e esa expresi贸n, el resultado ser谩 True y se ejecutar谩 el bloque de c贸digo. Una vez llegado al final del bloque, se volver谩 a evaluar la condici贸n, se cumplir谩, y vuelta a empezar. No te recomiendo que ejecutes el siguiente c贸digo, pero puedes intentarlo.

# No ejecutes esto, en serio
while True:
    print("Bucle infinito")

Es posible tener un while en una sola l铆nea, algo muy 煤til si el bloque que queremos ejecutar es corto. En el caso de tener mas de una sentencia, las debemos separar con ;.

x = 5
while x > 0: x-=1; print(x)

Tambi茅n podemos usar otro tipo de operaci贸n dentro del while, como la que se muestra a continuaci贸n. En este caso tenemos una lista que mientras no este vac铆a, vamos eliminando su primer elemento.

x = ["Uno", "Dos", "Tres"]
while x:
    x.pop(0)
    print(x)
#['Dos', 'Tres']
#['Tres']
#[]

Else y while

Algo no muy corriente en otros lenguajes de programaci贸n pero si en Python, es el uso de la cl谩usula else al final del while. Podemos ver el ejemplo anterior mezclado con el else. La secci贸n de c贸digo que se encuentra dentro del else, se ejecutar谩 cuando el bucle termine, pero solo si lo hace 鈥減or razones naturales鈥. Es decir, si el bucle termina porque la condici贸n se deja de cumplir, y no porque se ha hecho uso del break.

x = 5
while x > 0:
    x -=1
    print(x) #4,3,2,1,0
else:
    print("El bucle ha finalizado")

Podemos ver como si el bucle termina por el break, el print() no se ejecutar谩. Por lo tanto, se podr铆a decir que si no hay realmente ninguna sentencia break dentro del bucle, tal vez no tenga mucho sentido el uso del else, ya que un bloque de c贸digo fuera del bucle cumplir谩 con la misma funcionalidad.

x = 5
while True:
    x -= 1
    print(x) #4, 3, 2, 1, 0
    if x == 0:
        break
else:
    # El print no se ejecuta
    print("Fin del bucle")

Bucles anidados

Ya hemos visto que los bucles while tienen una condici贸n a evaluar y un bloque de c贸digo a ejecutar. Hemos visto ejemplos donde el bloque de c贸digo son operaciones sencillas como la resta -, pero podemos complicar un poco mas las cosas y meter otro bucle while dentro del primero. Es algo que resulta especialmente 煤til si por ejemplo queremos generar permutaciones de n煤meros, es decir, si queremos generar todas las combinaciones posibles. Imaginemos que queremos generar todas las combinaciones de de dos n煤meros hasta 2. Es decir, 0-0, 0-1, 0-2,鈥 hasta 2-2.

# Permutaci贸n a generar
i = 0
j = 0
while i < 3:
    while j < 3:
        print(i,j)
        j += 1
    i += 1
    j = 0

Vamos a analizara el ejemplo paso por paso. El primer bucle genera n煤meros del 0 al 2, lo que corresponde a la variable i. Por otro lado el segundo bucle genera tambi茅n n煤mero del 0 al 2, almacenados en la variable j. Al tener un bucle dentro de otro, lo que pasa es que por cada i se generan 3 j. Muy importante no olvidar que al finalizar el bucle de la j, debemos resetear j=0 para que en la siguiente iteraci贸n la condici贸n de entrada se cumpla.

Podemos complicar las cosas a煤n m谩s y tener tres bucles anidados, generando combinaciones de 3 elementos con n煤mero 0, 1, 2. En este caso tendremos desde 0,0,0 hasta 2,2,2.

i, j, k = 0, 0, 0
while i < 3:
    while j < 3:
        while k < 3:
            print(i,j,k)
            k += 1
            j += 1
        k = 0
    i += 1
    j = 0

Ejemplos while

脕rbol de navidad en Python. Imprime un 谩rbol de navidad formado con * haciendo uso del while y de la multiplicaci贸n de un entero por una cadena, cuyo resultado en Python es replicar la cadena.

z = 7
x = 1
while z > 0:
    print(' ' * z + '*' * x + ' ' * z)
    x+=2
    z-=1
#      *     
#     ***    
#    *****   
#   *******  
#  *********
# ***********

Aunque esta no sea tal vez la mejor forma de iterar una cadena es un buen ejemplo para el uso del while e introducir el indexado de listas con [], que veremos en otros cap铆tulos.

text = "Python"
i = 0
while i < len(text):
    print(text[:i + 1])
    i += 1
# P
# Py
# Pyt
# Pyth
# Pytho
# Python

Sucesi贸n de Fibonacci en Python. En matem谩ticas, la sucesi贸n de fibonacci es una sucesi贸n infinita de n煤meros naturales, donde el siguiente es calculado sumando los dos anteriores.

a, b = 0, 1
while b < 25:
    print(b)
    a, b = b, a + b
#1, 1, 2, 3, 5, 8, 13, 21