Saltar a contenido

Bucles for

Sentencia for

Imaginemos una colección cualquiera, una lista, una tupla, o una cadena de caracteres. Podemos recorrerla elemento a elemento mediante:

RecorrerLista.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
personas = [ 'Ana',
             'Juan',
             'Andrés',
             'Victor',
             'Luisa',
             'Cristina']

tamaño = len(personas)
n = 0

while n<tamaño:
    print(personas[n])
    n += 1

Lo que muestra:

Ana
Juan
Andrés
Victor
Luisa
Cristina

Como alternativa a una sentencia while, tenemos la sentencia for:

RecorrerLista2.py
1
2
3
4
5
6
7
8
9
personas = [ 'Ana',
             'Juan',
             'Andrés',
             'Victor',
             'Luisa',
             'Cristina']

for persona in personas:
    print(persona)

La sentencia for recorre una colección, controlando internamente su tamaño sin que tengamos que preocuparnos por ello. Para cada elemento, lo copia en una variable de trabajo (en este caso, persona).

Nótese que en el bloque interno no tenemos acceso a la colección, sino a la copia del elemento de turno.

Iteradores e Iterables

Un iterable es un objeto que se puede recorrer con un mecanismo for o similar, para obtener elementos. Las listas, tuplas, o cadenas de texto, son iterables.

Un iterador es un mecanismo que genera elementos a medida que se le va preguntando. Por ejemplo:

Range
1
2
3
numeros = range(1,10)
for n in numeros:
    print(n)

Muestra:

1
2
3
4
5
6
7
8
9

La función range(a,b) crea un objeto que, al ser recorrido, genera valores entre a y b-1 (el valor b quedará excluido de la secuencia).

Ver la diferencia entre:

numeros1 = [1,2,3,4,5,6,7,8,9]
numeros2 = range(1,10)

Aparentemente son similares, pero la primera crea una lista, almacenando los valores en la memoria. La segunda crea una lista virtual. Los valores se van generando uno a uno a medida que se van necesitando, y se suprimen para hacer espacio al siguiente.

Podemos crear listas o tuplas a partir de un iterador mediante:

Range2
1
2
3
4
5
6
7
numeros = range(1,10)
numeros2 = list(numeros)
numeros3 = tuple(numeros)

print(numeros)
print(numeros2)
print(numeros3) 

Lo que muestra:

range(1, 10)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
(1, 2, 3, 4, 5, 6, 7, 8, 9)

En el primer caso, tenemos un iterador, no una colección de datos. En el segundo, una lista entre corchetes, y en el tercero, una tupla.