De nuevo cambiamos el flujo lineal de nuestra aplicación para realizar iteraciones o repeticiones de una parte del código. Cada que que tengo que atacar los bucles, con independencia del lenguaje de programación en el que sea, recuerdo los primeros minutos de los Simpson, en el que se veía a Bart Simpson, repitiendo una y otra vez una frase en una pizarra, como castigo de alguna fechoría que había realizado. Si Bart Simpson, hubiera tenido conocimientos de programación podría haber solucionado esto con un bucle for
o incluso con un while
. Y es que, precisamente, la ventaja que nos aporta los bucles es la posibilidad de repetir una parte de nuestro código mientras que se cumplan una serie de condiciones.
Bucles en Python, for y while
Básicamente en Python puedes encontrar dos bucles for
y while
. Aunque en otros lenguajes de programación, tienes algún tipo de bucle mas, lo cierto es que con estos dos, puedes resolver todas las situaciones a las que te enfrentes.
El bucle for
El bucle for
nos permite iterar sobre un conjunto de elementos. Este conjunto de elementos puede ser del tipo lista
, tupla
, texto
, aunque también puede ser cualquier otro tipo que sea iterable.
Por ejemplo, podemos imprimir tres veces una cadena de texto como en el siguiente ejemplo,
lista = [1, 2, 3]
for i in lista:
print("No lo volveré a hacer")
Si lo único que quieres hacer es repetir un número de veces una frase, no es necesario que crees previamente una lista, puedes utilizar la función range
, que te ayudará a realizar exactamente esto,
for i in range(1, 4):
print("No lo volveré a hacer")
Indicarte que la función range
genera una lista que comienza con el primer valor, en el caso de nuestro ejemplo el 1
, y termina con el último valor sin incluirlo. Es decir, en nuestro caso iría del 1
al 3
, dado que hemos definido como último valor el 4
.
De la misma manera que hemos iterado sobre enteros, también es posible iterar sobre los caracteres de una cadena de texto. Por ejemplo,
frase = "No lo volveré a hacer"
for in in frase:
print(i)
Lo que verás cuando ejecutes esta función es que se imprimirán cada uno de los caracteres que constituyen la frase.
Interrumpir, continuar y pasar
Hay tres instrucciones o sentencias que tienes que tienes que tener en cuenta cuando trabajas con bucles, como son break
, continue
y pass
. Estas instrucciones te permiten modificar el comportamiento del bucle. Bueno, realmente, dos de las tres, break
y continue
, porque pass
no hace absolutamente nada.
La primera de ellas, break
, permite interrumpir la ejecución del bucle. De esta forma cuando se está recorriendo los elementos de un bucle, si se alcanza la instrucción break
se termina el bucle. Por ejemplo,
for x in range(5):
if x == 2:
break
print(x)
Lo que verás al ejecutar será,
0
1
Como ves no se alcanza en ningún caso el elemento 2
de la lista y se interrumple la ejecución del bucle que tenemos en curso.
La segunda de las instrucciones, continue
, tiene un comportamiento similar, pero en ningún caso se interrumpe la ejecución del bucle. Así. Siguiendo con el ejemplo anterior, y reemplazando el break
por un continue
,
for x in range(5):
if x == 2:
continue
print(x)
Lo que verás al ejecutar será,
0
1
3
4
Como ves, en este caso se recorre todo el bucle, pero se salta la ejecución del elemento 2
.
Por último pass
no hace nada. Es decir, cuando se está ejecutando un bucle y se llega a la sentencia pass
se pasa a la siguiente instrucción que haya a continuación, pero sin modificar el flujo establecido, es decir, sin alterar la normal ejecución del bucle. ¿Y para que utilizar entonces pass
? Yo lo utilizo habitualmente cuando estoy escribiendo código y hay una parte que todavía no he completado y sin tener alguna línea de código no se ejecutará el mismo. Por ejemplo, en el caso de un if then
, como lo que te muestro a continuación,
if x == 2:
pass
Si todavía no tengo preparado el código que se tiene que ejecutar cuando se cumpla la condición, simplemente añado ese pass
. De otra manera se producirá un error, por la sangría necesaria.
Por supuesto que estas tres instrucciones, no solo se utilizan con bucles for
sino que se utilizan con cualquier tipo de bucles.
Y for también tiene else
Algo que no utilizo pero que tienes a tu disposición para cuando lo necesites es else
en un bucle for
. ¿Como funciona? El funcionamiento es sencillo, cuando se termina el bucle for
. Por ejemplo,
for x in range(2):
print(x)
else:
print('El último es x = %d' % (x))
Al ejecutar esta pieza de código, obtendrías lo siguiente,
0
1
El último es x = 1
Ahora estarás pensando que esto se cumplirá siempre, pero no es necesariamente así. Si utilizas un break
de forma que se interrumpe la ejecución del código, no se ejecutará. Por ejemplo,
for x in range(2):
if x == 1:
break
print(x)
else:
print('El último es x = %d' % (x))
Al ejecutar esta pieza de código, obtendrías lo siguiente,
0
En el caso de utilizar un continue
si que se ejecutará el else
porque definitivamente si que se llega al final del bucle. Por ejemplo,
for x in range(2):
if x == 1:
continue
print(x)
else:
print('El último es x = %d' % (x))
El resultado de ejecutar estas líneas de código es,
0
El último es x = 1
Si te das cuenta de las ejecución de las líneas de código anteriores, si bien no se imprime el elemento 1
si que se alcanza el final y por esto imprime la sentencia correspondiente al else
.
El bucle while
Otra opción que tienes para la realización de bucles es el uso de while
. Este bucle se ejecutará miestras se cumpla una determinada condición. Esto puede llevar a que el bucle se ejecute de forma indefinida en el caso de que la condición se cumpla siempre, con lo que es un aspecto que tienes que tener muy en cuenta.
Por ejemplo,
n = 0
while n < 2:
print(n)
n += 1
El resultado sería el siguiente,
0
1
Lo que te indicaba anteriormente respecto a los bucles infinitos, sería lo siguiente,
while True:
print("Python es maravilloso")
Esto va a imprimir de forma continua y hasta que tu lo interrumpas con un Ctrl+C
, la frase Python es maravilloso
.
Al igual que te indiqué anteriormente con break
, continue
y pass
, en el caso de los bucles while
también puedes hacer uso de estas instrucciones para interrumpir el flujo de acuerdo a tus necesidades.
Bucles anidados
Otra interesante construcción que puedes hacer son los bucles anidadados, es decir, bucles dentro de bucles dentro de bucles… Esto te permite recorrer por ejemplo un array
de dos dimensiones, por citarte algo. Por ejemplo, para hacer la tabla de multiplicar, simplemente tienes que utilizar el siguiente código,
for i in range(1, 3):
print(f"Tabla de multiplicar del {i}")
for j in range(1, 5):
print(f"{i} x {j} = {i*j}")
El resultado en este caso sería el siguiente,
Tabla de multiplicar del 1
1 x 1 = 1
1 x 2 = 2
1 x 3 = 3
1 x 4 = 4
Tabla de multiplicar del 2
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
De forma equivalente lo puedes hacer con un bucle while
, tal y como te muestro a continuación,
i = 1
while i < 3:
print(f"Tabla de multiplicar del {i}")
j = 1
while j < 5:
print(f"{i} x {j} = {i*j}")
j += 1
i += 1
i = 1
while i < 3:
print(f"Tabla de multiplicar del {i}")
j = 1
while j < 5:
print(f"{i} x {j} = {i*j}")
j += 1
i += 1
El vídeo
Por supuesto y como no podía ser de otra forma, a continuación encontrarás el vídeo con todo lo que has podido leer hasta el momento.
Conclusión
Con estos bucles ya es mucho mas sencillo trabajar con distintos de los tipos de datos que has podido ver en las anteriores Pyldoras Pythonicas, listas, tuplas, diccionarios. Es muy sencillo recorrer todos los elementos de cada uno de estos tipos, y operar con ellos. Llegó el momento de la diversión.