Introduzione
Python è uno dei linguaggi di programmazione più popolari al mondo. In Python, i parametri fanno parte delle definizioni delle funzioni. Consentono di specificare determinati argomenti per una funzione. L'argomento può essere accettato e applicato dalla funzione.
Tuttavia, al momento della scrittura del codice non è possibile sapere quali casi d'uso esatti verranno implementati. Pertanto, a beneficio dei futuri programmatori e utenti del programma, è consigliabile passare un numero variabile di argomenti a una funzione. Per fare ciò, è necessario utilizzare parametri speciali. Questi sono *args e **kwargs. In questo tutorial, impareremo tutto sui parametri *args e **kwargs in Python. Impareremo anche come ordinare gli argomenti e come applicarli nelle chiamate di funzione.
Prerequisiti
Per poter seguire i passaggi del tutorial, ci sono alcuni prerequisiti da preparare. Innanzitutto, è necessario avere Python 3 installato sul server con un ambiente di programmazione attivo e funzionante. È inoltre necessario avere installato il programma per il proprio sistema operativo specifico (Ubuntu, CentOS, Debian, ecc.).
Cos'è *args e come funziona?
Iniziamo col capire come funziona *args . La versione del parametro con un singolo asterisco viene utilizzata per inviare alle funzioni elenchi di argomenti di lunghezza variabile senza parole chiave. Tieni presente che l'asterisco è l'elemento più critico in quel parametro.
Per capire meglio, consideriamo un esempio. Di seguito è riportata una tipica funzione che potresti trovare nel tuo codice, che utilizza due argomenti:
|
1 2 |
def multiply(x, y): print (x * y) |
Come puoi vedere, i nostri argomenti nella funzione sopra sono x e y. Quando chiami la funzione, utilizzerai i numeri corrispondenti a x e y. Diciamo che stiamo passando gli interi 5 e 4 per x e y rispettivamente:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4) |
Ora possiamo eseguire il codice:
|
1 |
python lets_multiply.py |
L'output che riceveremo sarà il seguente:
|
1 2 3 |
Output: 20 |
L'output mostra che gli interi 5 e 4 sono stati moltiplicati. Questo significa che la funzione multiply(x, y) ha funzionato.
Ora, supponiamo di voler moltiplicare tre numeri invece di due. Sfortunatamente, l'aggiunta di un numero extra alla funzione sopra genererà un errore come questo:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4, 3) |
|
1 2 3 |
Output: TypeError: multiply() takes 2 positional arguments but 3 were given |
Pertanto, se pensi di dover aggiungere altri argomenti in seguito, applica il parametro *args per tua comodità. Puoi usarlo in questo modo:
|
1 2 3 4 5 6 7 8 9 10 |
def multiply(*args): z = 1 for num in args: z *= num print(z) multiply(4, 5) multiply(10, 9) multiply(2, 3, 4) multiply(3, 5, 10, 6) |
Abbiamo semplicemente sostituito i parametri di funzione x e y con *args. L'esecuzione di questo codice ti darà il prodotto per ogni singola chiamata di funzione in questo modo:
|
1 2 3 4 5 6 |
Output: 20 90 24 900 |
Pertanto, *args è ideale da usare quando si desidera inviare elenchi di argomenti di lunghezza variabile alla funzione. Grazie a questa capacità, è possibile passare tutti gli argomenti desiderati alle chiamate di funzione. In questo modo, questo parametro consente di creare codice più flessibile in grado di accettare una buona quantità di argomenti variabili e senza parole chiave nella funzione.
Cos'è **kwargs e come funziona?
Successivamente, abbiamo la versione con doppio asterisco dei parametri, ovvero **kwargs. A differenza della forma precedente, questo parametro consente di passare alla funzione dizionari di argomenti con parole chiave e di lunghezza variabile. Simile a *args, i doppi asterischi sono l'elemento più critico del parametro.
Come abbiamo fatto nella sezione precedente, puoi aggiungere tutti gli argomenti che desideri. La differenza è che devi assegnare delle parole chiave. Per capire meglio, considera il seguente esempio. Qui, inizieremo stampando gli **kwargs argomenti che vogliamo passare alla funzione:
|
1 2 |
def print_kwargs(**kwargs): print(kwargs) |
Ora, chiamiamo la funzione. Come puoi vedere, abbiamo aggiunto argomenti con parole chiave:
|
1 2 3 4 |
def print_kwargs(**kwargs): print(kwargs) print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True) |
Eseguendo il programma a questo punto vedrai questo output:
|
1 |
python print_kwargs.py |
|
1 2 3 |
Output: {'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'} |
Tuttavia, esiste la possibilità che il tipo di dati del tuo dizionario non sia ordinato. Questo dipende in gran parte dalla versione di Python 3 che utilizzi. Ad esempio, qualsiasi versione successiva a Python 3.6 restituisce le coppie chiave-valore in ordine. Qualsiasi versione precedente mostrerà l'output in ordine casuale. Il dizionario che crei si chiamerà kwargs. Nota che puoi usarlo e manipolarlo come qualsiasi altro dizionario sul sistema. Vediamo come puoi mettere il parametro **kwargs a un uso e un'applicazione più ampi.
Nel seguente esempio, proveremo a creare una nuova funzione che saluterà un dizionario con dei nomi. Il nostro dizionario di esempio avrà due nomi:
|
1 2 3 4 5 |
def print_values(**kwargs): for key, value in kwargs.items(): print("The value of {} is {}".format(key, value)) print_values(my_name="Sammy", your_name="Casey") |
Eseguendo il programma otterrai questo output:
|
1 |
python print_values.py |
|
1 2 3 4 |
Output: Il valore di your_name è Casey Il valore di my_name è Sammy |
Similmente all'esempio precedente, i dizionari potrebbero apparire non ordinati. Pertanto, l'ordine dei nomi Casey e Sammy potrebbe essere invertito in alcuni casi.
Successivamente, passeremo argomenti aggiuntivi alla funzione. Questo dimostrerà che puoi fare in modo che **kwargs accetti qualsiasi numero di argomenti desideri:
|
1 2 3 4 5 6 7 8 9 10 11 |
def print_values(**kwargs): for key, value in kwargs.items(): print("The value of {} is {}".format(key, value)) print_values( name_1="Alex", name_2="Gray", name_3="Harper", name_4="Phoenix", name_5="Remy", name_6="Val") |
Eseguendo il programma vedrai questo output:
|
1 2 3 4 5 6 7 8 |
Output: Il valore di name_2 è Gray Il valore di name_6 è Val Il valore di name_4 è Phoenix Il valore di name_5 è Remy Il valore di name_3 è Harper Il valore di name_1 è Alex |
Anche questo output potrebbe non essere ordinato. In ogni caso, questi esempi mostrano che **kwargs offre al tuo programma la flessibilità di utilizzare una serie di argomenti con parole chiave.
Come ordinare gli argomenti
È importante tenere a mente l'ordine stabilito quando si ordina un argomento in una funzione o in una chiamata di funzione. È il seguente:
-
Argomenti posizionali formali
-
*args
-
Argomenti con parole chiave
-
**kwargs
Supponiamo che tu stia usando *args e **kwargs con parametri posizionali espliciti. Ciò significa che la tua funzione si presenterà così:
|
1 2 |
def example(arg_1, arg_2, *args, **kwargs): ... |
D'altra parte, l'uso di questi parametri con i parametri nominali (keyword parameters) darà alla tua funzione la seguente struttura generale:
|
1 2 |
def example2(arg_1, arg_2, *args, kw_1="squalo", kw_2="blobfish", **kwargs): ... |
Il mancato rispetto dell'ordine stabilito genererà un errore di sintassi (syntax error) durante l'esecuzione del codice. Pertanto, è meglio evitare di commettere questo errore fin dall'inizio.
Come usare *args e **kwargs nelle chiamate di funzione
Infine, ti mostreremo come utilizzare entrambi i parametri per passare argomenti alle funzioni. Inizieremo con un esempio che mostra *args:
|
1 2 3 4 5 6 7 8 |
def some_args(arg_1, arg_2, arg_3): print("arg_1:", arg_1) print("arg_2:", arg_2) print("arg_3:", arg_3) args = ("Sammy", "Casey", "Alex") some_args(*args) |
Ci sono tre parametri in questa funzione: arg_1, arg_2, e arg_3. Devi creare una variabile e impostarla su un iterabile. In questo caso, sarà una tupla. Quindi, puoi passare la variabile alla funzione usando la sintassi con l'asterisco.
Osserva l'output quando esegui il programma usando il comando python some_args.py :
|
1 2 3 4 5 |
Output: arg_1: Sammy arg_2: Casey arg_3: Alex |
È possibile modificare il programma anche in un tipo di dati lista iterabile con un nome di variabile diverso. Il codice seguente combina *args con un parametro nominale:
|
1 2 3 4 5 6 7 8 |
def some_args(arg_1, arg_2, arg_3): print("arg_1:", arg_1) print("arg_2:", arg_2) print("arg_3:", arg_3) my_list = [2, 3] some_args(1, *my_list) |
L'output sarà il seguente eseguendo il programma:
|
1 2 3 4 5 |
Output: arg_1: 1 arg_2: 2 arg_3: 3 |
D'altra parte, puoi applicare argomenti nominali con **kwargs. Assicurati di creare una variabile che sia uguale a un dizionario. Dovrebbe avere 2 coppie chiave-valore. Ecco come passeremo la variabile a una funzione con 3 argomenti:
|
1 2 3 4 5 6 7 8 |
def some_kwargs(kwarg_1, kwarg_2, kwarg_3): print("kwarg_1:", kwarg_1) print("kwarg_2:", kwarg_2) print("kwarg_3:", kwarg_3) kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"} some_kwargs(**kwargs) |
Usa il comando python some_kwargs.py ancora una volta per eseguire il programma:
|
1 2 3 4 5 |
Output: kwarg_1: Val kwarg_2: Harper kwarg_3: Remy |
Conclusione
Al termine di questo tutorial, dovresti avere una buona familiarità con cosa siano *args e **kwargs e come funzionano. Ora puoi applicare questi parametri al tuo codice per rendere il tuo programma flessibile per i futuri utenti. Sono ideali per le situazioni in cui non sai quanti argomenti potrebbero essere utilizzati. Assicurati solo di prestare attenzione agli elementi critici delle funzioni e dei parametri.
Infine, ecco altre risorse dal nostro blog che ti aiuteranno a lavorare con successo con Python:
- Il formato di file txt: lavorare con file di testo normale in Python 3
- I cicli in Python 3: usare le istruzioni Break, Continue e Pass
- Importare moduli in Python 3: una guida completa
- Usare i formattatori di stringhe in Python 3
- Programmare con Python 3: come procedere per costruire classi e definire oggetti?
Buona programmazione!
Commenti
Ancora nessun commento. Scrivi il primo.