In questa lezione impareremo ad utilizzare i cicli for annidati in Python, ovvero le iterazioni eseguite dentro altre iterazioni.
Facciamo dunque degli esempi per capire il loro funzionamento.
Esempio sui cicli for annidati in Python
Produrre un rettangolo di asterischi di base 4 asterischi e altezza 3.
L’output dovrà essere dunque questo:
* * * *
* * * *
* * * *
Per realizzare ciò usiamo due cicli, uno esterno ed uno interno.
Due cicli for annidati richiedono contatori diversi, indichiamo con i il contatore del primo ciclo, mentre con j il contatore del secondo ciclo.
Banner Pubblicitario
Quindi, in questo caso, il ciclo esterno verrà ripetuto tre volte, mentre quello interno quattro volte per ogni ciclo esterno.
Ecco di seguito il codice completo:
for i in range(3):
for j in range(4):
print(‘*’, end=‘ ‘)
Banner pubblicitario
print()
Utilizziamo la keyword end all’interno del print per inserire gli asterischi sulla stessa riga e dunque evitare di andare a capo.
Mentre l’ultimo print() serve semplicemente per andare a capo, dopo aver stampato ciascuna riga.
Spieghiamo dunque passo passo cosa succede:
Prima iterazione del ciclo esterno: i=0
Prima iterazione del ciclo interno: j=0 stampa l’asterisco seguito dallo spazio vuoto.
Seconda iterazione del ciclo interno: j=1 stampa un altro asterisco seguito dallo spazio vuoto.
Terza iterazione del ciclo interno: j=2 stampa un asterisco seguito dallo spazio vuoto.
Quarta iterazione del ciclo interno: j=3 stampa un asterisco seguito dallo spazio vuoto.
Seconda iterazione del ciclo esterno: i=1
Si procede analogamente a quanto detto prima.
Per provare quanto spiegato provate a sostituire gli asterischi ai valori di i e j, inserendo al posto di print(‘*’, end=’ ‘) il codice indicato sotto:
print(‘i:’,i,‘j:’,j, end=‘ ‘)
Ma attenzione! Lo stesso rettangolo si poteva realizzare con un solo ciclo for, semplicemente moltiplicando il carattere asterisco (*) 4 volte per ogni riga.
for i in range(3):
print(‘* ‘*4)
Secondo esempio sui cicli for
Variamo l’esercizio precedente producendo adesso un rettangolo con i numeri da 1 a 4.
Cioè l’output deve essere questo:
1 2 3 4
1 2 3 4
1 2 3 4
Dobbiamo cambiare solo il ciclo interno, impostando nel range i valori (1, 5).
Dopo, ad ogni iterazione del ciclo interno stampiamo l’indice j.
Ecco dunque il codice:
for i in range(3):
for j in range(1, 5):
print(j, end=‘ ‘)
print()
Terzo esempio
Adesso stampiamo i numeri in ordine decrescente, dunque variamo l’esempio precedente in modo da avere il seguente output:
4 3 2 1
4 3 2 1
4 3 2 1
Per stampare i numeri in ordine decrescente possiamo cambiare il range in modo tale che j varia da 4 a 1 con step di -1.
Ecco dunque il codice completo:
for i in range(3):
for j in range(4, 0, -1):
print(j, end=‘ ‘)
print()
Quarto esempio cicli for
Vogliamo adesso realizzare un altro esempio utilizzando due cicli for annidati, come l’esempio sotto:
1234567
123456
12345
1234
123
12
1
Basta stampare j e di volta in volta diminuire di 1 il numero di righe:
n = 7
for i in range(n):
for j in range(1, n+1-i):
print(j, end='')
print()
Quinto esempio
Realizziamo un altro esempio:
7654321
654321
54321
4321
321
21
1
n = 7
for i in range(n):
for j in range(n-i, 0, -1):
print(j, end='')
print()
Sesto esempio
Realizziamo adesso un esempio come questo:
1
21
321
4321
54321
654321
7654321
n = 7
for i in range(1, n+1):
for j in range(i, 0, -1):
print(j, end='')
print()
Settimo esempio
Realizziamo una figura come questa:
*
**
***
****
*****
****
***
**
*
Prima soluzione:
n = 5
for i in range(1, n * 2):
if i <= n:
for j in range(i, 0, -1):
print('*', end='')
print()
else:
for j in range(1, n * 2 + 1 - i):
print('*', end='')
print()
Il ciclo esterno stamperà le nove righe. Infatti i varia da 1 a 9.
All’interno del ciclo se i <= 5 realizziamo un altro ciclo for che stamperà la prima volta 1 asterisco, poi 2, ecc…fino ad arrivare a 5.
Infatti alla prima iterazione i vale 1, alla successiva 2 e così via fino a i=5.
for j in range(i, 0, -1):
print(‘*’, end=”)
Quando i sarà uguale a 5 si farà quanto scritto nell’else e quindi l’altro ciclo for che stamperà n*2-i asterischi. La prima volta n*2-i=10-6 cioè 4 asterischi, la seconda n*2-i=10-7 cioè 3 e così via.
Seconda soluzione semplificata con due cicli for:
n = 5
for i in range(1, n*2):
for j in range(1, n+1):
if i <= n and j <= i:
print('*', end='')
elif i > n and j < n * 2 + 1 - i:
print('*', end='')
else:
print(' ', end='')
print()
Terza soluzione con gli operatori logici
n = 5
for i in range(1, n*2):
for j in range(1, n+1):
if i <= n and j <= i or i > n and j < n*2 + 1 - i:
print('*', end='')
else:
print(' ', end='')
print()
Alcuni link utili
Indice tutorial sul linguaggio Python
1 – Introduzione al linguaggio Python
2 – Le variabili
3 – Operatori aritmetici e di assegnazione
4 – Stringhe
5 – Casting
6 – Input e print
8 – Errori in Python
9 – Script Python
10 – Scambio di variabili
11 – Modulo math
Commenti recenti