Capítol 6 — Repetir amb for i range
Capítol 6

Repetir amb for i range

Si saps quantes vegades has de repetir una cosa, for és més curt i clar que while.

for i in range(n)

Al capítol anterior vam fer servir while per comptar fins a 5. Ho pots fer amb molt menys codi usant for (en anglès, for loop):

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.

El for ja s'encarrega de tot: inicialitzar i, avançar-lo i aturar-se quan s'acaba la seqüència. No cal escriure i = 0 ni i = i + 1.

Si vols que els números comencin a 1 en comptes de 0, pots sumar-hi 1 o usar la forma de dos arguments (que veurem a continuació):

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

range() accepta fins a tres arguments: inici, fi (sense incloure) i pas. Amb dos arguments, triem exactament on comença i on acaba:

Amb el tercer argument —el pas— controlem quant avança i a cada iteració:

El pas també pot ser negatiu per comptar enrere. En aquest cas l'inici ha de ser més gran que la fi:

Bucles imbricats: la taula de multiplicar

Pots posar un for dins d'un altre for. El bucle interior s'executa sencer per cada iteració del bucle exterior. Això s'anomena bucles imbricats (en anglès, nested loops).

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

Observa la indentació: el print8 espais (dues capes d'indentació) perquè pertany al bucle interior, que al seu torn pertany al bucle exterior.

Modifica el codi per generar la taula completa del 1 al 10:

Quan fer servir for i quan while?

La regla pràctica és senzilla:

  • Usa for quan saps d'antuvi quantes vegades vols repetir, o quan recorres una seqüència de valors.
  • Usa while quan el nombre de repeticions depèn d'una condició que pot canviar durant l'execució (per exemple, la resposta de l'usuari).

Compara els dos codis que fan exactament el mateix:

El for és l'eina adequada per al primer cas. Reserva el while per quan la condició és variable o desconeguda.

Errors típics

Aquests són els errors més habituals en els primers programes amb for i range.

1. Off-by-one: confondre el límit de range — recorda que range(n) va de 0 fins a n-1, i que el segon argument de range(a, b) no s'inclou mai:

2. Modificar la variable de control dins del bucle — el for sobreescriu i a cada iteració; canviar-la dins del bucle no té l'efecte que esperaries:

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

3. Oblidar els dos punts ::

Exercici

Escriu un programa que llegeixi un nombre enter N i 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:

*
**
***
****

Pista: a la iteració i (que va de 1 fins a N) has d'imprimir i asteriscs. Pots usar "*" * i per repetir el caràcter.

Resum

  • for i in range(n): repeteix el bloc n vegades, amb i prenent valors 0, 1, …, n-1.
  • range(inici, fi) genera valors des de inici fins a fi-1 (la fi no s'inclou mai).
  • range(inici, fi, pas) avança de pas en pas; el pas pot ser negatiu per comptar enrere.
  • Els bucles imbricats 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 la condició depèn d'un valor variable.
  • No modifiquis la variable de control (i) dins del for; usa continue per saltar iteracions.