Espandere e passare liste, tuple e dizionari come argomenti di funzioni in Python

Attività commerciale

In Python, liste (array), tuple e dizionari possono essere espansi (scompattati) e i loro rispettivi elementi possono essere passati insieme come argomenti di funzioni.

Quando chiamate una funzione, specificate l'argomento con * per le liste e le tuple e ** per i dizionari. Notate il numero di asterischi *.

I seguenti dettagli sono descritti qui.

  • Espandi (scompatta) una lista o una tupla con * (un asterisco)
    • Per le funzioni con argomenti predefiniti
    • Per le funzioni con argomenti di lunghezza variabile
  • Espandi (scompatta) il dizionario con ** (due asterischi)
    • Per le funzioni con argomenti predefiniti
    • Per le funzioni con argomenti di lunghezza variabile

Vedere il seguente articolo per l'uso di base delle funzioni Python, gli argomenti di default e gli argomenti di lunghezza variabile con *,** quando si definiscono le funzioni.

Espandi (scompatta) una lista o una tupla con * (un asterisco)

Quando una lista o una tupla viene specificata come argomento con *, viene espansa e ogni elemento viene passato come argomento separato.

def func(arg1, arg2, arg3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

l = ['one', 'two', 'three']

func(*l)
# arg1 = one
# arg2 = two
# arg3 = three

func(*['one', 'two', 'three'])
# arg1 = one
# arg2 = two
# arg3 = three

t = ('one', 'two', 'three')

func(*t)
# arg1 = one
# arg2 = two
# arg3 = three

func(*('one', 'two', 'three'))
# arg1 = one
# arg2 = two
# arg3 = three

La seguente spiegazione è per una lista, ma lo stesso vale per una tupla.

Se il numero di elementi non corrisponde al numero di argomenti, si verifica un errore TypeError.

# func(*['one', 'two'])
# TypeError: func() missing 1 required positional argument: 'arg3'

# func(*['one', 'two', 'three', 'four'])
# TypeError: func() takes 3 positional arguments but 4 were given

Per le funzioni con argomenti predefiniti

Se viene impostato un argomento predefinito, l'argomento predefinito viene utilizzato se il numero di elementi è insufficiente. Se il numero di elementi è troppo grande, si verifica un errore TypeError.

def func_default(arg1=1, arg2=2, arg3=3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

func_default(*['one', 'two'])
# arg1 = one
# arg2 = two
# arg3 = 3

func_default(*['one'])
# arg1 = one
# arg2 = 2
# arg3 = 3

# func_default(*['one', 'two', 'three', 'four'])
# TypeError: func_default() takes from 0 to 3 positional arguments but 4 were given

Per le funzioni con argomenti di lunghezza variabile

Se è impostato un argomento di lunghezza variabile, tutti gli elementi dopo l'elemento per l'argomento posizionale sono passati all'argomento di lunghezza variabile.

def func_args(arg1, *args):
    print('arg1 =', arg1)
    print('args =', args)

func_args(*['one', 'two'])
# arg1 = one
# args = ('two',)

func_args(*['one', 'two', 'three'])
# arg1 = one
# args = ('two', 'three')

func_args(*['one', 'two', 'three', 'four'])
# arg1 = one
# args = ('two', 'three', 'four')

Espandi (scompatta) il dizionario con ** (due asterischi)

Quando un dizionario dict è specificato come argomento con **, le chiavi degli elementi sono espanse come nomi di argomenti e i valori come valori di argomenti, e ciascuno è passato come argomento separato.

def func(arg1, arg2, arg3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

d = {'arg1': 'one', 'arg2': 'two', 'arg3': 'three'}

func(**d)
# arg1 = one
# arg2 = two
# arg3 = three

func(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three'})
# arg1 = one
# arg2 = two
# arg3 = three

Se non c'è una chiave che corrisponde al nome dell'argomento o se c'è una chiave che non corrisponde, risulterà un errore TypeError.

# func(**{'arg1': 'one', 'arg2': 'two'})
# TypeError: func() missing 1 required positional argument: 'arg3'

# func(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three', 'arg4': 'four'})
# TypeError: func() got an unexpected keyword argument 'arg4'

Per le funzioni con argomenti predefiniti

Immagine in cui vengono aggiornati solo i valori dei nomi degli argomenti che corrispondono alle chiavi del dizionario.

Una chiave che non corrisponde al nome dell'argomento risulterà in un errore TypeError.

def func_default(arg1=1, arg2=2, arg3=3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

func_default(**{'arg1': 'one'})
# arg1 = one
# arg2 = 2
# arg3 = 3

func_default(**{'arg2': 'two', 'arg3': 'three'})
# arg1 = 1
# arg2 = two
# arg3 = three

# func_default(**{'arg1': 'one', 'arg4': 'four'})
# TypeError: func_default() got an unexpected keyword argument 'arg4'

Per le funzioni con argomenti di lunghezza variabile

Se sono impostati argomenti di lunghezza variabile, qualsiasi elemento con una chiave diversa dal nome dell'argomento specificato come argomento viene passato all'argomento di lunghezza variabile.

def func_kwargs(arg1, **kwargs):
    print('arg1 =', arg1)
    print('kwargs =', kwargs)

func_kwargs(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three'})
# arg1 = one
# kwargs = {'arg2': 'two', 'arg3': 'three'}

func_kwargs(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three', 'arg4': 'four'})
# arg1 = one
# kwargs = {'arg2': 'two', 'arg3': 'three', 'arg4': 'four'}

func_kwargs(**{'arg1': 'one', 'arg3': 'three'})
# arg1 = one
# kwargs = {'arg3': 'three'}
Copied title and URL