# Funzioni in Python Le **funzioni** sono uno dei concetti fondamentali in Python. Una funzione è un blocco di codice riutilizzabile che può essere chiamato in diversi punti del programma per eseguire una specifica operazione. Le funzioni permettono di evitare la ripetizione del codice, migliorano la leggibilità e facilitano la manutenzione dei programmi. --- ## Definire una funzione In Python, le funzioni vengono definite utilizzando la parola chiave **`def`**, seguita dal nome della funzione, dalle parentesi tonde (che possono contenere parametri) e dai due punti `:`. Il blocco di codice della funzione è indentato. ### Sintassi di base ```python def nome_funzione(): # Blocco di codice che esegue un'operazione pass # 'pass' indica che non c'è codice qui (opzionale) ``` ### Esempio: funzione semplice ```python def saluta(): print("Ciao, benvenuto!") # Chiamata della funzione saluta() # Output: Ciao, benvenuto! ``` --- ## Funzioni con parametri Le funzioni possono accettare uno o più **parametri**. I parametri sono variabili che vengono passate alla funzione quando viene chiamata. Questi parametri consentono di fornire dati che la funzione utilizzerà al suo interno. ### Esempio con parametri ```python def saluta_persona(nome): print(f"Ciao, {nome}!") saluta_persona("Alice") # Output: Ciao, Alice! saluta_persona("Mario") # Output: Ciao, Mario! ``` In questo esempio, la funzione `saluta_persona()` accetta un parametro chiamato `nome` che viene utilizzato all'interno della funzione. --- ## Funzioni con valori di ritorno (return) Le funzioni possono restituire un valore utilizzando la parola chiave **`return`**. Una volta eseguito il `return`, l'esecuzione della funzione si interrompe e il valore viene restituito al chiamante. ### Esempio con valore di ritorno ```python def somma(a, b): return a + b risultato = somma(3, 4) print(risultato) # Output: 7 ``` In questo caso, la funzione `somma()` accetta due parametri, li somma e restituisce il risultato con `return`. --- ## Parametri con valori di default È possibile assegnare dei **valori di default** ai parametri di una funzione. Se la funzione viene chiamata senza specificare quel parametro, verrà utilizzato il valore di default. ### Esempio di parametri con valori di default ```python def saluta(nome="Amico"): print(f"Ciao, {nome}!") saluta() # Output: Ciao, Amico! saluta("Francesco") # Output: Ciao, Francesco! ``` In questo esempio, il parametro `nome` ha un valore di default `"Amico"`. Se la funzione viene chiamata senza argomenti, utilizzerà quel valore di default. --- ## Funzioni con più parametri Le funzioni possono accettare più parametri separati da virgole. ### Esempio con più parametri ```python def moltiplica(a, b, c): return a * b * c risultato = moltiplica(2, 3, 4) print(risultato) # Output: 24 ``` In questo caso, la funzione `moltiplica()` accetta tre parametri e restituisce il prodotto dei tre numeri. --- ## Funzioni con argomenti variabili (Args e Kwargs) Python consente di definire funzioni che possono accettare un numero arbitrario di argomenti. Questo si realizza utilizzando gli argomenti posizionali variabili `*args` o gli argomenti keyword variabili `**kwargs`. ### Argomenti Posizionali Variabili (`*args`) Utilizzando `*args`, una funzione può accettare un numero variabile di argomenti. ```python def somma_tutti(*numeri): return sum(numeri) risultato = somma_tutti(1, 2, 3, 4, 5) print(risultato) # Output: 15 ``` In questo esempio, la funzione `somma_tutti()` può accettare un numero variabile di numeri e restituire la loro somma. ### Argomenti Keyword Variabili (`**kwargs`) Con `**kwargs`, una funzione può accettare un numero variabile di argomenti sotto forma di coppie chiave-valore. ```python def stampa_informazioni(**dati): for chiave, valore in dati.items(): print(f"{chiave}: {valore}") stampa_informazioni(nome="Mario", eta=23, lavoro="Studente") # Output: # nome: Mario # eta: 23 # lavoro: Studente ``` In questo esempio, la funzione `stampa_informazioni()` accetta argomenti con nome e li stampa in formato chiave-valore. --- ## Scope delle variabili (Locale e Globale) Le variabili definite all'interno di una funzione hanno uno **scope locale**, cioè esistono solo all'interno della funzione stessa. Le variabili definite al di fuori delle funzioni hanno uno **scope globale** e possono essere accessibili da qualunque parte del programma. ### Esempio di scope locale ```python def funzione(): x = 10 # Variabile locale print(x) funzione() # Output: 10 # print(x) genererà un errore, perché x non esiste fuori dalla funzione ``` ### Esempio di scope globale ```python x = 5 # Variabile globale def funzione(): print(x) funzione() # Output: 5 ```