
Le funzioni variadiche in python
Le funzioni variadiche in python sono quelle funzioni che possono accettare un numero variabile di argomenti.
A cosa servono? Le funzioni variadiche (variadic function) sono molto utili quando non sai in anticipo il numero di argomenti che verranno passati alla tua funzione. Ci sono due tipi di funzioni variadiche in python: le funzioni con argomenti varidici posizionali e quelle chiave-valore.
Le funzioni con argomenti variadici posizionali
Le funzioni con argomenti variadici posizionali usano un asterisco (*) prima del nome del parametro.
Questo raccoglie tutti gli argomenti posizionali extra in una tupla.
- def funzione_variadic_posizionale(*args):
- for arg in args:
- print(arg)
In questo esempio args è una tupla con tutti gli argomenti passati alla funzione.
Ad esempio, chiama la funzione passandogli tre parametri
funzione_variadic_posizionale(5, 2020,"Londra")
La funzione riceve i tre parametri nella tupla.
5
2020
Londra
In questo caso, in args[0] trovi il primo parametro (5), in args[1] il secondo (2020) e in args[2] il terzo ("Londra").
Questo ti permette di passare un numero variabile di parametri alla funzione.
Puoi anche usare nomi diversi da args
Al posto di "args" puoi indicare qualsiasi altro nome dopo l'asterisco. Ad esempio *parametri, *lista, ecc.
In genere si utilizza "args" o "varargs" per consuetudine ma non è obbligatorio.
Una curiosità. La denominazione dei parametri "args" o "varargs" in python trae ispirazione dal file header "varargs.h" del linguaggio C, che era usato per fornire le liste di variabili degli argomenti ai programmi in C.
Funzioni con argomenti variadici chiave-valore
Le funzioni con argomenti variadici chiave-valore usano due asterischi (**) prima del nome del parametro.
In questo caso tutti gli argomenti sono memorizzati in un dizionario ossia in una struttura chiave-valore.
- def funzione_variadic_chiave_valore(**kwargs):
- for chiave, valore in kwargs.items():
- print(f"{chiave}: {valore}")
In questo esempio, kwargs è un dizionario che contiene tutte le coppie chiave-valore passate alla funzione.
Ad esempio, chiama la funzione passandogli questi parametri
funzione_variadic_chiave_valore(anno=2020, mese=5, stato="Usa")
La funzione riceve le coppie chiave-valore nel dizionario kwargs.
anno: 2020
mese: 5
stato: Usa
In questo caso in kwargs['stato'] c'è il valore "Usa", in kwargs['anno'] c'è il valore 2020, kwargs['mese'] c'è il valore 5.
Queste funzioni sono particolarmente utili dove il numero di parametri può variare.
Ad esempio, puoi usarlo per creare o configurare oggetti, dove ci possono essere molti parametri con valori predefiniti.
Funzioni variadiche con argomenti misti
Puoi anche combinare argomenti normali, *args e **kwargs nella stessa funzione. Tuttavia, l'ordine deve essere il seguente: parametri normali, *args, **kwargs.
funzione(parametri normali, *args, **kwargs)
Per spiegare meglio questo concetto ti faccio un esempio pratico.
- def esempio_funzione(nome, *args, **kwargs):
- print(f"Nome: {nome}")
- # Stampa tutti gli argomenti posizionali
- for arg in args:
- print(f"Arg posizionale: {arg}")
- # Stampa tutte le coppie chiave-valore
- for chiave, valore in kwargs.items():
- print(f"{chiave}: {valore}")
In questo esempio, il primo parametro "nome" è un argomento normale.
Il secondo parametro è *args che cattura tutti gli argomenti posizionali aggiuntivi (es. 1, 2, 3) e li mette in una tupla.
Il parametro **kwargs cattura tutti gli argomenti chiave-valore aggiuntivi (es. citta="Roma", età=30) e li mette in un dizionario.
Ora chiama la funzione passandogli più argomenti.
esempio_funzione("Mario", 1, 2, 3, citta="Roma", età=30)
Il primo argomento "Mario" viene memorizzato nel primo parametro "nome".
Gli argomenti posizionali successivi (1, 2, 3) sono memorizzati nella tupla args, mentre quelli chiave-valore nel dizionario kwargs.
Il risultato in output è il seguente:
Nome: Mario
Arg posizionale: 1
Arg posizionale: 2
Arg posizionale: 3
citta: Roma
età: 30
Questo ti permette di definire funzioni con un numero variabile di parametri e di argomenti in modo molto più flessibile in varie modalità di matching.