Capítol 6

La instrucció for i in range

Si saps quantes vegades hauràs de repetir una cosa, la instrucciófor acostuma a ser millor que while.

for i in range(n)

Al capítol anterior vam fer servir while per comptar fins a 5. Ho pots aconseguir escrivint menys codi, usant for. Fixa't com s'escriu:

Llegeix-ho: «per cada i dins de range(5), imprimeix i». range(5) genera la seqüència de nombres 0, 1, 2, 3, 4 —cinc valors que comencen a 0 i arriben fins a 4 (sense incloure el 5).
Fixa't que el valor 5 no apareix mai a la sortida.

La instrucció for inicialitza i=0, augmenta en una unitat i s'aturar quan cal.
És a dir, no cal escriure i = 0 ni i = i + 1.

Si vols que la teva numeració comencin per 1 en comptes de 0, una opció és sumar 1 dintre de la iteració. Aquest exemple donarà com a resultat els nombres 1, 2, 3, 4, 5

range(inici, fi)
range(inici, fi, pas)

range() accepta dos arguments: inici, fi (sense incloure). Amb aquestes dos arguments, triem exactament on comença i on acaba la nostra repetició.

Si afegim un tercer argument a range, podem controlar quant avança el comptador i a cada iteració. Per exemple, si volem fer una llista de nombres parells, ens convé saltar de dos en dos:

El pas també pot ser negatiu, i això vol dir comptar enrere. En aquest cas el nombre d'inici ha de ser més gran que el nombre de final:

La taula de multiplicar

Una instrucció for pot contenir, a dins, una altra instrucció for. La interior s'executa sencera per a cada pas de l'exterior. Això s'anomena iteracions enniuades (en anglès, nested loops).

L'exemple clàssic és la taula de multiplicar:

És obligatori fer servir la indentació correctament: la instrucció printel doble d'espais perquè pertany a la iteració interior.

Modifica el codi següent, amb l'objectiu de generar la taula completa de l'1 al 10:

Quan fem servir la instrucció for en lloc de while?

  • Fes servir la instrucciófor quan ja saps quantes vegades vols repetir, o bé quan recorres una seqüència coneguda de valors.
  • Fes servir la instrucciówhile quan el nombre de repeticions depèn d'una condició que pot canviar durant l'execució.


Compara aquests dos codis, que fan exactament el mateix:

Errors de sintaxi o d'execució

Aquests són els errors més habituals en programes que contenen les instruccions for

1. Límits: range(n) va de 0 a n-1, i range(x , y) va de x a y-1:

2. La variable de control no es pot modificar: la instrucció for sobreescriu el valor de i a cada iteració; per tant, canviar-la dins de la iteració no té l'efecte que esperaries.

Per saltar una iteració usa continue, igual que amb while:

3. Has d'escriure for i in range(5) afegint els dos punts al final, d'aquesta manera for i in range(5):

Exercici

Escriu un programa que llegeixi un nombre enter N i que imprimeixi un triangle de asteriscs (*) d'alçada N. La primera línia té 1 asterisc, la segona en té 2, i així fins a la fila N.

Per exemple, amb N = 4 la sortida ha de ser:

        *
        **
        ***
        ****
      

Resum

  • for i in range(n): repeteix el bloc n vegades, amb i prenent els valors 0, 1, …, n-1.
  • range(x, y) genera valors des de x fins a y-1.
  • range(x, y, pas) avança de pas en pas; el pas pot ser negatiu i així podem comptar enrere.
  • Les iteracions enniuades posen un for dins d'un altre: el bucle interior s'executa complet per cada iteració de l'exterior.
  • Usa for quan saps quantes repeticions vols; usa while quan el nombre de repeticions depen d'un valor que pot variar.
  • No modifiquis la variable de control (i) dins de la instrucció for; usa continue per saltar iteracions.