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 print té 8 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
forquan saps d'antuvi quantes vegades vols repetir, o quan recorres una seqüència de valors. - Usa
whilequan 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
*) 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 blocnvegades, ambiprenent valors0, 1, …, n-1.range(inici, fi)genera valors des deinicifins afi-1(la fi no s'inclou mai).range(inici, fi, pas)avança depasenpas; el pas pot ser negatiu per comptar enrere.- Els bucles imbricats posen un
fordins d'un altre: el bucle interior s'executa complet per cada iteració de l'exterior. - Usa
forquan saps quantes repeticions vols; usawhilequan la condició depèn d'un valor variable. - No modifiquis la variable de control (
i) dins delfor; usacontinueper saltar iteracions.