Bucles
Los bucles son otra herramienta para alterar el flujo normal de un programa. Nos permiten repetir una porción de código tantas veces como queramos. Python incluye únicamente dos tipos de bucle: while y for. Empecemos por el primero, que es más sencillo.
Bucle «while»
La palabra reservada while
ejecuta una porción de código una y otra
vez hasta que la condición especificada sea falsa; o, dicho de otro
modo, ejecuta una porción de código mientras que la condición sea
verdadera.
a = 1
while a < 10:
print("¡Hola, mundo!")
Si ejecutamos este código, veremos que el programa imprime
infintamente el mensaje en pantalla. Esto ocurre por cuanto la
condición a < 10
es inexorablemente siempre verdadera (uno es menor
que diez). Ahora bien, consideremos este otro ejemplo.
a = 1
while a < 10:
print("¡Hola, mundo!")
a = a + 1
Ahora el resultado es distinto: el mensaje se imprime nueve veces.
Analicemos por qué pasa esto. Cuando el intérprete tiene que ejecutar
el bucle, evalúa la condición a < 10
, que en un primer momento
equivale a 1 < 10
, que es verdadero. Entonces, ejecuta el bloque de
código dentro del bucle: imprime el mensaje en pantalla y luego le
suma 1
a la variable a
. Cuando el bloque de código finaliza, se
vuelve a evaluar la condición, que ahora resulta ser 2 < 10
, aún
verdadero. Luego se ejecuta nuevamente el bloque de código y el
proceso se repite hasta llegar a la condición 10 < 10
, que es falsa
y por ende el bucle termina.
Podemos ver con más detalle el proceso imprimiendo la variable a
.
a = 1
while a < 10:
print("¡Hola, mundo!")
print(a)
a += 1
Además, cambié la última línea por a += 1
, que
es simplemente un atajo para a = a + 1
.
Ahora bien, combinando lo que hemos aprendido hasta el momento y el conocimiento que obtuvimos sobre colecciones en la sección anterior, podemos crear un bucle while que imprima todos los elementos dentro de una lista.
lenguajes = ["Python", "C", "C++", "Java"]
i = 0
while i < len(lenguajes):
print(lenguajes[i])
i += 1
¡Excelente! No importa cuántos elementos agregemos a lenguajes
,
nuestro bucle estará preparado para imprimir todos ellos.
Bucle «for»
Si bien un bucle while es perfectamente capaz de, como vimos, imprimir los elementos de una colección, resulta que un bucle for es una herramienta más pertinente para este tipo de situaciones.
lenguajes = ["Python", "C", "C++", "Java"]
for lenguaje in lenguajes:
print(lenguaje)
¡Genial! Lo que ha ocurrido aquí es lo siguiente: el bucle for
ejecuta el bloque de código indentado (en este caso la llamada a
print()
) tantas veces como elementos haya en la colección indicada a
la derecha del operador in
. Pero, cada vez que ese código es
ejecutado, la variable lenguaje
tendrá un valor diferente: en la
primera ejecución será igual a "Python"
; en la segunda, a "C"
; y
así hasta alcanzar el final de la lista.
Este tipo de bucle for es bastante diferente al que prima en otros lenguajes de programación. No obstante, ese comportamiento puede conseguirse fácilmente en Python empleando otra de sus funciones incorporadas. Por ejemplo, si queremos imprimir números del 1 al 10:
for i in range(1, 11):
print(i)
¿Qué tipos de dato pueden ser recorridos con un bucle for? Bien,
de los que hemos visto, las colecciones (listas, tuplas y diccionarios)
y las cadenas (entendidas como una colección de caracteres). No
obstante, hay muchos otros objetos que no se incluyen en ninguna de
estas categorías y no obstante ello pueden ser recorridos. Se dice que
son objetos iterables. Este es el caso del objeto retornado por la
función range()
.
Históricamente, range()
retornaba una lista, de modo que range(1, 4) == [1, 2, 3]
. En versiones actuales de Python, su funcionamiento es
un tanto más complejo, por cuanto genera los números del rango
especificado a medida que son utilizados, para optimizar el rendimiento
del código. No te preocupes, no es una cuestión relevante en este
momento. En última instancia, puedes convertir cualquier objeto
iterable a una lista vía list()
.
>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Perfecto. Ya hemos logrado un conocimiento básico sobre estas cuestiones. Volveremos más adelante sobre alguna que otra funcionalidad relacionada con el tema. Me interesa que hablemos ahora de a las funciones.