La sentencia iterativa for nos permite ejecutar un proceso un número determinado de veces o para un conjunto determinado de valores. Para explicar este último comentario veamos la estructura de este tipo de bucles:
for variable in serie-de-valores:
código
Si quisiéramos leer esta instrucción sería algo como "para cada valor que hay en serie-de-valores, asigna dicho valor a 'variable' y ejecuta el código que le sigue". Es decir, se va a ejecutar el código una vez para cada uno de los elementos en "serie-de-valores". Comencemos por el ejemplo más simple, cuando la serie de valores son números:
Para cada ejecución del código, la variable n va tomando cada uno de los valores de la lista [1, 2, 3], y el código que se repite simplemente imprime el valor de n. Hay tres valores en la lista, y el código se repite tres veces. En este caso hemos especificado los valores que va a tomar n con una lista, pero podríamos haber utilizado una tupla u otra estructura.
En un caso como éste, en lugar de incluir la lista explícita de valores que va a tomar la variable n puede utilizarse una función como range. Esta función --que ya hemos visto- genera un conjunto de números entre dos valores, pudiendo especificarse el incremento entre los valores. La gran ventaja de range respecto de una lista o una tupla es que la lista o tupla va a ocupar un tamaño en memoria proporcional al número de elementos que la compone. range, por el contrario, va a ocupar siempre el mismo tamaño (pequeño) pues solo se van a generar los números que representa a medida que sean necesarios. Es decir, algo como range(1, 1000000) no genera un millón de valores y los almacena en memoria. Simplemente se crea un "objeto range" que irá generando ese millón de números cuando se soliciten.
El código mostrado en In [260] podría reescribirse de la siguiente forma, por tanto:
Recuerda que los números generados por range(a, b) van desde a (incluido) hasta b (sin incluir), por lo que deberemos especificar como límites 1 y 4 si queremos que los valores generados sean 1, 2, y 3.
Si simplemente queremos especificar el número de veces que queremos que se repita el proceso, digamos 3 veces, bastará con escribir for n in range(3): pues ya sabemos que esto generará todos los valores entre 0 y 2, es decir, 3 números:
Los valores a recorrer no tienen por qué ser siempre numéricos, por ejemplo:
Bucles for con diccionarios
Un caso interesante (y práctico) es el uso de este tipo de bucles con diccionarios. Si recuerdas, el método items devolvía una estructura semejante a una lista que contenía tuplas con cada pareja clave-valor:
Pues bien, si recorremos esta lista estaremos extrayendo tuplas (pues se trata de una lista de tuplas), por lo que podemos asignar a una tupla de variables la tupla extraída en cada iteración del bucle for:
En la práctica no es necesario encerrar las dos variables a los que se asignan los valores entre paréntesis, pudiéndose escribir simplemente lo siguiente: