Tema 4: Iteración

Compartir en:
Haz clic aquí para ver la videoclase

Contenidos

Iteración

Uno de los principales usos que nos provee la progamación es la automatización de tareas repetitivas. En nuestro día a día es frecuente encontrarnos en la situación de tener que realizar la misma secuencia de acciones muchas veces aplicada a diferentes objetos. Por ejemplo: cuando calificamos un examen, realizamos la secuencia de corregir las mismas preguntas tantas veces como exámenes tengamos. De igual manera, cuando queremos cambiar el nombre y numerar una serie de archivos en una carpeta, realizamos la misma acción renombrar tantas veces como archivos hay en esa carpeta.


Para resolver estas tareas, se utiliza la iteración. Los lenguajes de programación permiten definir bloques de código y repetirlos tantas veces como establezcamos. Normalmente se llaman bucles.

Bucles

Los bucles forman parte de los elementos de control de flujo. Cuando una ejecución se topa con un bucle, la parte de código indentada se repite una y otra vez hasta cumplir las condiciones que hayamos definido. Dado que el flujo abandona la secuencia lineal lógica, decimos que ha habido una alteración del flujo.


Fig. 1: Flujo de un bucle

En Python existen dos tipos de iteraciones según el criterio de repetición: los bucles determinados, aquellos que se formulan con un número de iteraciones o repeticiones preestablecido y los bucles indeterminados, potencialmente infinitos.


Bucles determinados

Cuando conocemos a priori el número de veces que debe repetirse la tarea, utilizamos las sentencias for ... in. Imaginemos que acaba de comenzar el curso y queremos numerar los nombres de nuestros alumnos. Tenemos que imprimir la secuencia "número" + "nombre del alumno" tantas veces como alumnos haya en la lista. Cuando formulamos un bucle, es recomendable definir en primer lugar el código de la acción que necesitamos repetir. En este caso podría ser print(numero, alumno).


Dado que conocemos el número de iteraciones que necesita nuestro bucle (tantas como alumnos hay en la lista), utilizaremos un bucle for ... in. La lista con los elementos que iterar se coloca después del in y el operador for se ocupa de asignar a una variable el valor del elemento de la lista en cada iteración. Veámoslo en un ejemplo:

1for alumno in ['Luis', 'Juan', 'Pedro']:
2  print(alumno)
Luis
Juan
Pedro


El bucle del ejemplo anterior tendrá tres iteraciones (una por cada elemento de la lista después del in) y en cada vuelta la variable for asignará a la variable alumno el valor que toque de la lista. El código indentado del bucle imprimer en la consola la variable alumno para que observemos cómo el bucle itera la lista Si ejecutamos el código, observaremos cómo alumno va tomando uno a uno los valores de la lista.


Reasignación de variables Una operación frecuente es el cambio de valor de una variable cuando ya ha sido declarada con un valor previo. Este cambio puede ocurrir con un valor totalmente nuevo o con uno derivado del primero.


1# Reasignamos x con un nuevo valor 
2x = 2
3x = 3
4print(x)
3
1# Reasignamos x con un valor derivado del primero
2x = 2
3x = x+1 # tomamos el valor inicial de x y le aplicamos una operación
4print(x)
3


La reasignación es una operación frecuente en los bucles. Veamos cómo podemos incrementar un contador en cada iteración para llevar la cuenta de las vueltas del bucle. Recuerda que, para reasignar una variable, primero hay que declararla. Por ello, debemos incluir un valor inicial para la variable fuera del bucle.


1contador = 0
2for alumno in ['Luis', 'Juan', 'Pedro']:
3  print(alumno)
4  contador = contador + 1
5  print('Esta es la vuelta número ', contador)
Luis
Esta es la vuelta número  1
Juan
Esta es la vuelta número  2
Pedro
Esta es la vuelta número  3

Ya sabemos cómo numerar a nuestros tres alumnos. Utilizaremos la técnica del contador:

1numero = 0
2for alumno in ['Luis', 'Juan', 'Pedro']:
3  numero = numero + 1
4  print(numero, alumno)
1 Luis
2 Juan
3 Pedro


La variable después del for se denomina iterador y puede llamarse igual que cualquier variable de las que declaramos normalmente. Muchas veces se utiliza una letra, pero es recomendable utilizar nombres con semántica para mantener la claridad. Observa cómo el bucle anterior se mantiene igual cambiando el iterador.

1contador = 0
2for i in ['Luis', 'Juan', 'Pedro']:
3  print(i)
4  contador = contador + 1
5  print('Esta es la vuelta número ', contador)
Luis
Esta es la vuelta número  1
Juan
Esta es la vuelta número  2
Pedro
Esta es la vuelta número  3


Bucles indeterminados

En ocasiones no sabremos cuántas iteraciones serán necesarias. Simplemente necesitaremos un bucle que se repita hasta que una condición se cumpla. En estos casos utilizamos los bucles con while. La sintaxis de estos bucles es while seguido de la condición con la que debe terminar el bucle. Un ejemplo puede ser un bucle que incremente el valor de una variable hasta un límite. Incrementemos el valor de nuestro contador hasta 10:

1contador = 0
2while contador <= 10:
3  print(contador)
4  contador = contador + 1
0
1
2
3
4
5
6
7
8
9
10


Alteración de los bucles

En Python existen dos operadores para alterar las iteraciones de los bucles. El operador continue interrumpe la ejecución del código indentado y pasa a la siguiente iteración. Imaginemos que queremos volver a ejecutar el bucle de la lista de alumnos, pero queremos saltar a Juan. Debemos introducir una sentencia condicional: 'si el alumno es Juan, salta a la siguiente iteración':


1numero = 0
2for alumno in ['Luis', 'Juan', 'Pedro']:
3  if alumno == 'Juan':
4    continue
5  numero = numero + 1
6  print(numero, alumno)
1 Luis
2 Pedro

El operador break detiene el bucle y continúa ejecutando las secuencias no indentadas. Este operador es especialmente útil en los bucles indeterminados. Como mencionamos arriba, estos bucles son potencialmente infinitos. Para hacer un bucle sin condiciones podemos declararlo como while True:. Es muy importante, cuando declaramos un bucle infinito, insertar la condición que finalizará las iteraciones. Si no, la ejecución del script nunca se detendrá.


Podemos hacer un bucle que se ejecute hasta que se introduzca la contraseña correcta ('pez espada'):

1while True:
2  contrasena = input('Contraseña: ')
3  if contrasena == 'pez espada':
4    print('Acertaste')
5    break
6  else:
7    print('contraseña incorrecta')
Contraseña: password
contraseña incorrecta
Contraseña: contraseña
contraseña incorrecta
Contraseña: pez espada
Acertaste