Python - Cicli nidificati

Ciao, aspiranti programmatori! Oggi, immergeremo nel fascinante mondo dei cicli nidificati in Python. Come il vostro insegnante di computer amichevole, sono entusiasta di guidarvi in questa avventura. Credetemi, alla fine di questa lezione, sarete in grado di creare cicli come dei professionisti!

Python - Nested Loops

Cos'è un Ciclo Nidificato?

Prima di immergerci nel profondo, iniziamo con le basi. Immagina di organizzare il tuo armadio. Passi ogni ripiano (quello è un ciclo), e per ogni ripiano, ordini tutti gli oggetti su di esso (ecco un altro ciclo all'interno del primo). Questo è essenzialmente cosa sono i cicli nidificati nella programmazione: cicli all'interno di cicli!

Ciclo for nidificato in Python

Iniziamo con il ciclo for, che è come un vecchio amico affidabile nel mondo di Python.

Struttura di Base

Ecco la struttura generale di un ciclo for nidificato:

for variabile_esterna in sequenza_esterna:
# Corpo del ciclo esterno
for variabile_interna in sequenza_interna:
# Corpo del ciclo interno

Esempio Semplice: Tabella di Moltiplicazione

Creiamo una semplice tabella di moltiplicazione per capire meglio:

for i in range(1, 6):
for j in range(1, 6):
print(f"{i} x {j} = {i*j}", end="\t")
print()  # Passa alla riga successiva dopo ogni riga

Questo codice produrrà:

1 x 1 = 1    1 x 2 = 2    1 x 3 = 3    1 x 4 = 4    1 x 5 = 5
2 x 1 = 2    2 x 2 = 4    2 x 3 = 6    2 x 4 = 8    2 x 5 = 10
3 x 1 = 3    3 x 2 = 6    3 x 3 = 9    3 x 4 = 12   3 x 5 = 15
4 x 1 = 4    4 x 2 = 8    4 x 3 = 12   4 x 4 = 16   4 x 5 = 20
5 x 1 = 5    5 x 2 = 10   5 x 3 = 15   5 x 4 = 20   5 x 5 = 25

Spiegazione:

  1. Il ciclo esterno (for i in range(1, 6)) si esegue 5 volte, rappresentando le righe.
  2. Per ogni iterazione del ciclo esterno, il ciclo interno (for j in range(1, 6)) si esegue 5 volte, rappresentando le colonne.
  3. Stampiamo ogni risultato di moltiplicazione, usando end="\t" per aggiungere uno spazio di tabulazione invece di una nuova riga.
  4. Dopo ogni riga (iterazione del ciclo esterno), stampiamo una riga vuota per passare alla riga successiva.

Esempio del Mondo Reale: Disposizione dei Posti

Immagina di essere un insegnante (come me!) che organizza i posti per una classe. Creiamo una tabella di sedute:

students = ["Alice", "Bob", "Charlie", "David", "Eve"]
rows = 3
seats_per_row = 2

seat_number = 0
for row in range(1, rows + 1):
print(f"Riga {row}:")
for seat in range(1, seats_per_row + 1):
if seat_number < len(students):
print(f"  Posto {seat}: {students[seat_number]}")
seat_number += 1
else:
print(f"  Posto {seat}: Vuoto")
print()  # Linea vuota tra le righe

Questo produrrà:

Riga 1:
Posto 1: Alice
Posto 2: Bob

Riga 2:
Posto 1: Charlie
Posto 2: David

Riga 3:
Posto 1: Eve
Posto 2: Vuoto

In questo esempio:

  1. Il ciclo esterno itera attraverso ogni riga.
  2. Il ciclo interno assegna gli studenti ai posti in ogni riga.
  3. Utilizziamo una variabile seat_number per tenere traccia di quale studente stiamo assegnando dopo.
  4. Se finiamo gli studenti, contrassegniamo i posti rimanenti come "Vuoto".

Ciclo while nidificato in Python

Ora, incontriamo il cugino del ciclo while – il ciclo while nidificato. È come una guardia attenta che continua a controllare una condizione.

Struttura di Base

Ecco come appare tipicamente un ciclo while nidificato:

while condizione_esterna:
# Corpo del ciclo esterno
while condizione_interna:
# Corpo del ciclo interno

Esempio: Piramide di Numeri

Creiamo una piramide di numeri per vedere i cicli while nidificati in azione:

row = 1
while row <= 5:
col = 1
while col <= row:
print(col, end=" ")
col += 1
print()  # Passa alla riga successiva
row += 1

Questo produrrà:

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

Spiegazione:

  1. Il ciclo while esterno controlla il numero di righe (da 1 a 5).
  2. Per ogni riga, il ciclo while interno stampa numeri da 1 al numero della riga corrente.
  3. Incrementiamo col all'interno del ciclo interno e row all'interno del ciclo esterno.

Esempio del Mondo Reale: Controllo dell'Inventario

Immagina di gestire un piccolo negozio. Devi controllare regolarmente l'inventario. Simuliamo questo con cicli while nidificati:

inventory = {
"mele": 50,
"banane": 30,
"arance": 40
}

days = 1
while days <= 3:  # Controlla per 3 giorni
print(f"Giorno {days} Controllo dell'Inventario:")
for fruit, quantity in inventory.items():
while quantity > 0:
print(f"Controllando {fruit}...")
quantity -= 10  # Simula la vendita di 10 unità per controllo
if quantity <= 20:
print(f"Avviso di scarsità per {fruit}! Solo {quantity} rimasti.")
break  # Smetti di controllare questo frutto se la scorta è bassa
inventory[fruit] = quantity  # Aggiorna l'inventario
print(f"Fine del Giorno {days} Inventario: {inventory}\n")
days += 1

Questo produrrà qualcosa del genere:

Giorno 1 Controllo dell'Inventario:
Controllando mele...
Controllando mele...
Controllando mele...
Avviso di scarsità per mele! Solo 20 rimasti.
Controllando banane...
Avviso di scarsità per banane! Solo 20 rimasti.
Controllando arance...
Controllando arance...
Avviso di scarsità per arance! Solo 20 rimasti.
Fine del Giorno 1 Inventario: {'mele': 20, 'banane': 20, 'arance': 20}

Giorno 2 Controllo dell'Inventario:
Controllando mele...
Avviso di scarsità per mele! Solo 10 rimasti.
Controllando banane...
Avviso di scarsità per banane! Solo 10 rimasti.
Controllando arance...
Avviso di scarsità per arance! Solo 10 rimasti.
Fine del Giorno 2 Inventario: {'mele': 10, 'banane': 10, 'arance': 10}

Giorno 3 Controllo dell'Inventario:
Controllando mele...
Avviso di scarsità per mele! Solo 0 rimasti.
Controllando banane...
Avviso di scarsità per banane! Solo 0 rimasti.
Controllando arance...
Avviso di scarsità per arance! Solo 0 rimasti.
Fine del Giorno 3 Inventario: {'mele': 0, 'banane': 0, 'arance': 0}

In questo esempio:

  1. Il ciclo while esterno simula il controllo dell'inventario per 3 giorni.
  2. Utilizziamo un ciclo for per iterare attraverso ogni frutto nell'inventario.
  3. Il ciclo while interno simula il controllo e la vendita di ogni frutto fino a quando non è scarso o esaurito.
  4. Utilizziamo break per smettere di controllare un frutto se la quantità scende a 20 o meno.

Conclusione

Congratulazioni! Avete appena padroneggiato l'arte dei cicli nidificati in Python. Ricordate, i cicli nidificati sono strumenti potenti, ma usateli con saggezza. Possono rendere il vostro codice più lento se non utilizzati in modo efficiente.

Come per tutti i concetti di programmazione, la pratica fa l'artigiano. Provate a creare i vostri scenari di cicli nidificati – magari una configurazione della scacchiera, o un programma settimanale per la scuola. Le possibilità sono infinite!

Seguite a programmare, a imparare, e, più importante, divertitevi! Fino alla prossima volta, questo è il vostro insegnante di computer amichevole che firma off. Buon looping!

Credits: Image by storyset