Iteracions: for

Els bucles for en Python tenen una funció doble: d’una banda serveixen per recórrer seqüències, com poden ser les llistes, i fer alguna cosa amb cadascun dels seus elements, i d’altra banda serveixen simplement per a executar un conjunt d’ordres un nombre determinat de vegades.

La seua forma es la següent:

for element in seqüència :
    ordre

Açò significa que ordre s’executarà tantes vegades com elements tinga la seqüència i que en cada execució, el valor de la variable element serà el d’un d’aquestos elements. Observa l’exemple següent:

>>> for lletra in [ 'A', 'B', 'C', 'D', 'E', 'F' ]:
        print(lletra)
A
B
C
D
E
F

Aquest funcionament és semblant al que utilitzàvem amb Guido van Robot per a repetir una acció un determinat nombre de vegades, però també molt més potent, ja que no es limita a repetir una acció sinó que tenim una variable que anirà prenent diferents valors en cada repetició.

>>> nombres = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> for i in nombres:
        print('3 x',i,'=', i*3)
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27
3 x 10 = 30

Imaginem que ens interessa executar una serie d’ordres un nombre determinat de vegades, per exemple imprimir deu vegades la lletra «A» a la pantalla En aquest cas ens caldria crear una llista amb deu elements, encara que la llista en si mateixa no té cap interès per a nosaltres. Per fer açò utilitzarem la funció range().

La funció range() ens retorna un objecte de tipus range que es comporta de manera similar a una llista de nombres (encara que no ho és exactament), i de fet és fàcil transformar un objecte range en una vertadera llista amb la funció list(). La funció range() es pot cridar amb un, dos o tres paràmetres. Si la cridem amb un nombre com paràmetre ens retornarà una llista amb tants elements com li indiquem, amb dos paràmetres (que anomenarem per exemple i i j) ens retornarà els nombres des de i fins j-1, i amb un tercer paràmetre aquest servirà de valor de pas:

range(5) # retorna els nombres 0, 1, 2, 3 i 4
range(8, 13) # retorna els nombres 8, 9, 10, 11 i 12
list(range(8, 13)) # retorna la llista [8, 9, 10, 11 i 12]
range(5, 25, 4) # retorna els nombres 5, 9, 13, 17 i 21

Per tant, una manera fàcil de repetir un conjunt d’ordres un determinat nombre de vegades és la següent:

for i in range(nombre_de_repeticions):
    ordre
    ordre
    ordre

Per exemple:

>>> for i in range(5):
        print('A')
A
A
A
A
A
>>> for i in range(5):
        print('La variable "i" val', i)
La variable "i" val 0
La variable "i" val 1
La variable "i" val 2
La variable "i" val 3
La variable "i" val 4

La taula de multiplicar del 3 sense necessitat de tenir prèviament una llista amb els nombres de l’un al deu seria així:

>>> for i in range(1, 11):
        print('3 x', i, '=', i*3)
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27
3 x 10 = 30

Recorda que range(i,j) crea un objecte que ens retornarà els nombres començant en i i acabant en j-1. Per tant utilitzar range(1,11) en lloc de range(1,10) no és una errata. Eres capaç de veure que les dos expressions següents produeixen el mateix resultat?

for i in range(1, 11):
    print('3 x', i, '=', i*3)

for i in range(10):
    i += 1
    print('3 x', i, '=', i * 3)

for … else

Els bucles for també poden tenir un bloc else amb ordres que s’executaran quan el bucle haja recorregut completament la seqüència. Si el bucle es trenca amb una ordre break abans de recórrer completament la seqüència les ordres dins del bloc else no s’executaran. Observa l’exemple següent:

>>> llista = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for i in llista:
        if i == 5:
            print('El nombre 5 es troba en la llista.')
            break
    else:
        print('No s\'ha trobat el nombre 5 en la llista.')

Bucles niats

Es bucles es poden escriure uns dins d’altres. Així podem, per exemple, escriure les taules de multiplicar del 4 al 8.

for i in range(4,9):
    for j in range(11):
        print(i, 'x', j, '=', i*j)