Este post es parte del Curso de introducción a Python 3:
- Introducción a Python: Porque programar con Python
- Instalación de Python 3 y IDLE
- Primer programa: “Hola Mundo”
- Tipos de datos en Python
- Asignación y uso de variables
- Valores booleanos
- Colecciones de datos en Python: Listas y Tuplas
- Condicionales: If, else, elif
- Ciclos en Python
- Definición y uso de funciones en Python
- Importación y uso de módulos en Python
- Uso de strings en Python
Tabla de contenidos
Introducción
Los ciclos repetitivos o bucles son operaciones secuenciales que nos permiten repetir ciertas operaciones sobre valores concretos que varian con cada vuelta del ciclo, lo que genera una iteración.
En Python existen dos tipos de bucles:
- While
- For
Ciclos
Ciclos while
Los ciclos while
en Python son aquellos que se ejecutan mientras la condición que especifiquemos sea igual a True
. Su sintaxis es la siguiente:
while EXPRESION_BOOLEANA: CODIGO_A_EJECUTAR
Por ejemplo, el siguiente código que imprimirá los números del 1 al 10:
https://gist.github.com/Nxz02/d858b5743948f3d06d5cef6e71861249
Al igual que con las estructuras de control, deberemos indentar el código después de while
para indicar que se ejecutará en el ciclo. El ciclo terminará de ejecutarse cuando la condición especificada deje de ser True
, en este caso, cuando el valor de n
sea igual a 10
.
Ejemplo donde imprimimos una lista por completo aprovechando la función len()
para conocer su tamaño:
https://gist.github.com/Nxz02/fbbd00eb21ef33bc479318fc720c2907
Los ciclos while suelen usarse cuando desconocemos la duración exacta del ciclo.
Ciclos for
Los ciclos for, a diferencia de los ciclos while, tienen una duración determinada y una sintaxis diferente que nos permite asignar una variable temporal que cambiará de valor con cada iteración. Los podemos implementar de la siguiente manera:
for VAR in OBJETO_ITERABLE: CODIGO_A_EJECUTAR
Donde VAR
es la variable temporal y OBJETO_ITERABLE
cualquier objeto que podamos recorrer, como una lista, una tupla o un rango.
Por ejemplo, para imprimir una serie de números del 1 al 10:
https://gist.github.com/Nxz02/fc5ccc998c01eb377b4c3d0afff0c76e
La función range()
genera un rango de numeros determinado entre un limite inferior y un limite superior, como el limite superior es el tope del rango, el rango termina en el número anterior, en este caso, el rango generado termina en el número 10.
Dentro del ciclo for la variable temporal numero toma el valor de cada uno de los números dentro de range()
, por lo que su valor cambia desde 1 hasta 10 según la iteración del ciclo. Cuando el ciclo termina, la variable numero deja de existir.
Un ejemplo de un ciclo for aplicado a una lista:
https://gist.github.com/Nxz02/056ed67c0fa5b74e5d8f782886918c65
Podemos realizar lo mismo utilizando indices, gracias a la función len()
:
https://gist.github.com/Nxz02/a085945cf3f8a5f44fc41332a2dd9705
Ciclos infinitos
While
Una situación imprescindible de los ciclos while es que la condición que los mantiene ejecutandose deje de ser verdadera en algún punto.
https://gist.github.com/Nxz02/d858b5743948f3d06d5cef6e71861249
En el código anterior el ciclo puede terminar ya que el valor de n cambia dentro del cuerpo del ciclo, por lo que en algún momento el valor de n
es igual a 10
y la condición deja de ser True
. Sin embargo, si eliminamos la línea 3 del programa, entonces, además de que imprimiriamos el mismo valor una y otra vez, el ciclo sería infinito, ya que n nunca cambiaría su valor y por lo tanto la condición siempre sería verdadera.
Es importante que el elemento que permite que la condición inicial sea verdadera pueda cambiar para evitar caer en ciclos inifnitos.
Si por el contrario, lo que buscamos por alguna razón es crear un ciclo While infinito, la manera más facil de lograrlo es utilizando directamente el booleano True
.
https://gist.github.com/Nxz02/363b07e0964c1b42cac0a08d20134317
For
Aunque los ciclos for suelen tener una cantidad definida de iteraciones desde que los iniciamos, esto depende de que el objeto iterable que le indiquemos sea finito, algo que siempre será así si utilizamos tuplas y rangos, pero que puede cambiar si estamos recorriendo una lista, como se ve en el siguiente ciclo for infinito:
https://gist.github.com/Nxz02/591035d564252bc3b7d90c7cb4b577cf
En este caso el tamaño de la lista recorrida nunca deja de crecer, por lo que nunca se llegará a una última iteración.
Break y continue
Python nos provee de dos herramientas de uso exclusivo dentro de ciclos:
- break
- continue
El uso de la palabra reservada break
nos permite interrumpir la ejecución de un ciclo en cualquier momento, algo útil para salir de ciclos infinitos:
Por ejemplo, el siguiente ciclo que será interrumpido en la quinta iteración:
https://gist.github.com/Nxz02/d31fb9c2f0c89e190eb4a0be1953bca1
O el siguiente ciclo, que terminará al encontrar un número par:
https://gist.github.com/Nxz02/314ecf9c7196dcef9bc31050fcfdfbad
Mientras que el uso de continue
procede a la siguiente iteración del ciclo, ignorando el código siguiente. El siguiente programa recorrerá toda la lista y la función print()
siempre imprimirá la variable numero
, pero gracias a continue
sólo se imprimirán valores impares:
https://gist.github.com/Nxz02/fe4a28c85708854b51013ff4e88f3b1d
Ciclos anidados
Al igual que ocurre con las estructuras condicionales, podemos anidar ciclos dentro de otros ciclos.
Por ejemplo, el siguiente ciclo que imprime un número cada vez que se imprimen todas las vocales:
https://gist.github.com/Nxz02/3e6ddad551d09edb0fd9190848aeb1ef
La salida del programa será la siguiente:
Numero 1 A 1 E 1 I 1 O 1 U 1 Numero 2 A 2 E 2 I 2 O 2 U 2 Numero 3 A 3 E 3 I 3 O 3 U 3
Como puedes ver, el ciclo anidado se ejecuta por completo cada vez que el ciclo principal da una vuelta, algo a tener en cuenta cuando utilices ciclos anidados ya que pueden aumentar considerablemente la cantidad de operaciones que realices en tu programa, afectando su rendimiento.
Otro ejemplo utilizando while
:
https://gist.github.com/Nxz02/ed468f588ad83d136e54f1b9fd78c6a4
Salida:
1 10 2 20 3 30 4 40 5 50 6 60 7 70 8 80 9 90 10 100
En este código, ambos ciclos aumentan unitariamente el valor de suma1
y suma2
, respectivamente, pero al realizarse esta operación sobre suma2
dentro de un ciclo anidado, su valor termina siendo 10 veces mayor que el de suma1
.
Conclusión
Aunque se suele utilizar ciclos for cuando sabemos cuando terminara un ciclo de ejecutarse y los ciclos while cuando no tenemos esta certeza, practicamente cualquier operación puede realizarse con cualquiera de los dos ciclos, por lo que dependerá de ti elegir el que prefieras y sea más adecuado para la ocasión, siempre teniendo en cuenta la legibilidad del código.
Los ciclos nos ofrecen varias herramientas para utilizarlos, como break
y continue
, que te pueden servir para complementar tus ciclos y asegurarte de que siempre lleguen a un fin, sin embargo, si en tus ciclos dependes solamente de break para tener la certeza de que llegaran a un fin, deberías pensar de nuevo el planteamiento del ciclo. De igual forma ocurre con los ciclos anidados; es importante tomarte tu tiempo para analizar tu código y preguntarte si no podrías resolver el problema minimizando el número de operaciones.
En la siguiente entrada te mostraré la definición de funciones en Python, y como encapsular piezas de código para reutilizarlas cuantas veces quieras.
Deja una respuesta