# Cicli in Python I cicli sono una parte fondamentale della programmazione e consentono di eseguire un'operazione ripetutamente. In Python esistono due principali tipi di cicli: - **`while`**: esegue un blocco di codice finché una condizione è vera. - **`for`**: itera su una sequenza (lista, tupla, stringa, ecc.) o un intervallo (range). Vediamo in dettaglio come funzionano i cicli in Python. --- ## Il Ciclo `while` Il ciclo `while` continua a eseguire un blocco di codice **finché una condizione specificata è vera**. Se la condizione diventa falsa, il ciclo si interrompe. ### Sintassi del ciclo `while` ```python while condizione: # Codice da eseguire finché la condizione è vera pass # Blocco vuoto, può essere sostituito dal codice effettivo ``` ### Esempio di ciclo `while` ```python n = 1 while n <= 5: print(n) n += 1 # Incremento della variabile n a ogni iterazione ``` **Output**: ``` 1 2 3 4 5 ``` In questo esempio, il ciclo continua a eseguire finché `n` è minore o uguale a 5. A ogni iterazione, il valore di `n` viene incrementato di 1. --- ## Cicli infiniti con `while` È importante evitare cicli infiniti, in cui la condizione rimane sempre vera. Per interrompere un ciclo infinito, si può usare il comando **`break`**. ### Esempio di ciclo infinito con `break` ```python n = 1 while True: # Ciclo infinito print(n) n += 1 if n > 5: break # Interruzione del ciclo quando n diventa maggiore di 5 ``` In questo esempio, il ciclo verrebbe eseguito all'infinito se non fosse per l'istruzione `break`, che ferma l'esecuzione quando `n` diventa maggiore di 5. --- ## Il Ciclo `for` Il ciclo `for` in Python itera su una sequenza di valori come liste, tuple, stringhe, o intervalli definiti con `range()`. Per ogni elemento della sequenza, il ciclo esegue il blocco di codice associato. ### Sintassi del ciclo `for` ```python for variabile in sequenza: # Codice da eseguire per ogni elemento della sequenza pass # Blocco vuoto, può essere sostituito dal codice effettivo ``` ### Esempio di ciclo `for` su una lista ```python frutta = ["mela", "banana", "arancia"] for frutto in frutta: print(frutto) ``` **Output**: ``` mela banana arancia ``` Il ciclo itera su ogni elemento della lista `frutta`, assegnando il valore corrente alla variabile `frutto` e stampandolo. --- ## Iterazione su stringhe Il ciclo `for` può essere utilizzato anche per iterare su ogni carattere di una stringa. ### Esempio di ciclo `for` su una stringa ```python parola = "Python" for lettera in parola: print(lettera) ``` **Output**: ``` P y t h o n ``` --- ## Iterazione con `range()` La funzione `range()` viene spesso usata con i cicli `for` per generare una sequenza di numeri. Può essere utilizzata con uno, due o tre argomenti. ### Sintassi di `range()` - `range(fine)` → genera numeri da 0 fino a `fine - 1`. - `range(inizio, fine)` → genera numeri da `inizio` fino a `fine - 1`. - `range(inizio, fine, passo)` → genera numeri da `inizio` fino a `fine - 1`, saltando di `passo`. ### Esempio di ciclo `for` con `range()` ```python for i in range(5): print(i) ``` **Output**: ``` 0 1 2 3 4 ``` In questo esempio, il ciclo `for` itera sui numeri da `0` a `4` (valore di `range(5)`). ### Esempio con `range()` che specifica inizio, fine e passo ```python for i in range(1, 10, 2): print(i) ``` **Output**: ``` 1 3 5 7 9 ``` In questo esempio, il ciclo `for` itera sui numeri da `1` a `9`, saltando di 2 a ogni iterazione. --- ## Cicli annidati In Python è possibile **annidare** cicli, cioè inserire un ciclo all'interno di un altro. Questo è utile, ad esempio, per iterare su una matrice (lista di liste). ### Esempio di cicli annidati ```python matrice = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] for riga in matrice: for elemento in riga: print(elemento, end=" ") print() # Nuova riga dopo ogni riga della matrice ``` **Output**: ``` 1 2 3 4 5 6 7 8 9 ``` Il ciclo esterno itera sulle righe della matrice, mentre il ciclo interno itera sugli elementi di ogni riga. --- ## For inline (List Comprehension) In Python, esiste una sintassi compatta e potente per creare nuove liste, chiamata **list comprehension** o **for inline**. Questa sintassi permette di generare una lista in una singola riga di codice, rendendo il codice più leggibile e conciso. Le **list comprehension** sono utilizzate per trasformare o filtrare sequenze in modo efficiente, eliminando la necessità di scrivere cicli `for` espliciti. ### Sintassi di base ```python [nome_variabile for nome_variabile in sequenza] ``` ### Esempio semplice: lista di quadrati ```python # Creare una lista contenente i quadrati dei numeri da 0 a 9 quadrati = [x**2 for x in range(10)] print(quadrati) # Output: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] ``` In questo esempio, la list comprehension genera una nuova lista con i quadrati di ogni numero da `0` a `9`. ### List comprehension con condizione (if inline) È possibile aggiungere una condizione all'interno della list comprehension per includere solo gli elementi che soddisfano la condizione. ```python # Creare una lista contenente solo i numeri pari da 0 a 9 numeri_pari = [x for x in range(10) if x % 2 == 0] print(numeri_pari) # Output: [0, 2, 4, 6, 8] ``` In questo esempio, la list comprehension include solo i numeri pari (cioè quelli per cui `x % 2 == 0`). ### Esempio complesso: lista di parole in maiuscolo ```python # Trasformare una lista di parole in maiuscolo utilizzando una list comprehension parole = ["python", "è", "fantastico"] parole_maiuscole = [parola.upper() for parola in parole] print(parole_maiuscole) # Output: ['PYTHON', 'È', 'FANTASTICO'] ``` --- ### List comprehension con condizioni multiple Puoi combinare più condizioni e trasformazioni all'interno della list comprehension per filtrare e modificare gli elementi della lista. ```python # Creare una lista dei quadrati dei numeri pari da 0 a 9 quadrati_pari = [x**2 for x in range(10) if x % 2 == 0] print(quadrati_pari) # Output: [0, 4, 16, 36, 64] ``` In questo esempio, vengono inclusi solo i quadrati dei numeri pari da `0` a `9`. --- ### Dizionario e Set Comprehension La stessa logica delle list comprehension può essere applicata ai dizionari e ai set. #### Dizionario Comprehension ```python # Creare un dizionario con i numeri e i loro quadrati quadrati_dict = {x: x**2 for x in range(5)} print(quadrati_dict) # Output: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16} ``` #### Set Comprehension ```python # Creare un set dei quadrati dei numeri da 0 a 4 quadrati_set = {x**2 for x in range(5)} print(quadrati_set) # Output: {0, 1, 4, 9, 16} ```