Le Funzioni in Python
Obiettivi della pillola
Alla fine di questa pillola saprai:
- definire una funzione con
def; - distinguere tra parametri posizionali e nominali;
- utilizzare parametri opzionali (default values);
- gestire un numero variabile di argomenti (
*argse**kwargs).
Definizione base
Una funzione è un blocco di codice riutilizzabile che esegue un’azione specifica. In Python si definisce con la parola chiave def, seguita dal nome, parentesi tonde e due punti. Il corpo della funzione deve essere indentato.
def saluta(nome):
"""Questa funzione stampa un saluto."""
messaggio = f"Ciao, {nome}!"
return messaggio
# Chiamata della funzione
risultato = saluta("Mario")
print(risultato) # Ciao, Mario!
Parametri Posizionali e Nominali
Quando chiami una funzione, puoi passare gli argomenti in due modi:
- Posizionali: l’ordine è fondamentale. Il primo valore va al primo parametro, il secondo al secondo, ecc.
- Nominali (Keyword): specifichi il nome del parametro. L’ordine non conta più.
def descrivi(animale, verso):
print(f"Il {animale} fa {verso}")
# Posizionale (ordine corretto)
descrivi("cane", "bau")
# Nominale (ordine ininfluente)
descrivi(verso="miao", animale="gatto")
# Misto (i posizionali devono precedere i nominali!)
descrivi("mucca", verso="muu")
Parametri Opzionali (Default)
Puoi assegnare un valore predefinito a un parametro. Se chi chiama la funzione non fornisce quel valore, verrà usato quello di default. I parametri con default devono sempre essere definiti dopo quelli senza default.
# 'esponente' e opzionale, default = 2
def potenza(base, esponente=2):
return base ** esponente
print(potenza(3)) # 3^2 = 9 (usa il default)
print(potenza(3, 3)) # 3^3 = 27 (sovrascrive il default)
Nota: Attenzione ai valori di default mutabili (come liste o dizionari). Vengono creati una volta sola alla definizione della funzione.
Numero variabile di argomenti
A volte non sai in anticipo quanti argomenti verranno passati alla funzione. Python offre due strumenti potenti per questo.
*args: Tupla di argomenti posizionali
L’asterisco * prima del nome del parametro raccoglie tutti gli argomenti posizionali extra in una tupla.
def somma_tutto(*numeri):
# 'numeri' e una tupla: (10, 20, 30)
totale = 0
for n in numeri:
totale += n
return totale
print(somma_tutto(10, 20, 30)) # 60
**kwargs: Dizionario di argomenti nominali
Il doppio asterisco ** raccoglie gli argomenti nominali extra in un dizionario (Keyword ARGS).
def crea_profilo(nome, **dettagli):
# 'dettagli' e un dizionario: {'eta': 18, 'citta': 'Roma'}
print(f"Profilo di {nome}:")
for chiave, valore in dettagli.items():
print(f" - {chiave}: {valore}")
crea_profilo("Luca", eta=18, citta="Roma", sport="Calcio")
Unpacking degli argomenti
È possibile fare l’operazione inversa: se hai una lista o una tupla e vuoi passarne i valori come argomenti separati a una funzione, usa *.
coordinate = (10, 20)
def disegna_punto(x, y):
print(f"Disegno punto a {x}, {y}")
# Unpacking: la tupla viene 'esplosa' nei due argomenti
disegna_punto(*coordinate)
In breve: usa parametri opzionali per semplificare le chiamate comuni e *args/**kwargs per rendere le tue funzioni flessibili e capaci di gestire input imprevisti.
EC