W Pythonie listy (tablice), tuple i słowniki mogą być rozwijane (rozpakowywane), a ich poszczególne elementy mogą być przekazywane razem jako argumenty funkcji.
Przy wywoływaniu funkcji należy podać argument za pomocą * dla list i krotek oraz ** dla słowników. Należy zwrócić uwagę na liczbę gwiazdek *.
Opisano tu następujące szczegóły.
- Rozwiń (rozpakuj) listę lub tuple za pomocą * (jedna gwiazdka)
- W przypadku funkcji z domyślnymi argumentami
- W przypadku funkcji z argumentami o zmiennej długości
- Rozwiń (rozpakuj) słownik za pomocą ** (dwie gwiazdki)
- W przypadku funkcji z domyślnymi argumentami
- W przypadku funkcji z argumentami o zmiennej długości
Informacje na temat podstawowego użycia funkcji Pythona, domyślnych argumentów oraz argumentów o zmiennej długości z użyciem *,** podczas definiowania funkcji można znaleźć w poniższym artykule.
- RELATED:Jak używać i odnotowywać domyślne argumenty w funkcjach Pythona
- RELATED:Jak używać argumentów o zmiennej długości w Pythonie(
*args
,**kwargs
)
Rozwiń (rozpakuj) listę lub tuple za pomocą * (jedna gwiazdka)
Gdy lista lub tuple jest podana jako argument z *, jest ona rozwijana i każdy jej element jest przekazywany jako osobny argument.
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
Poniższe objaśnienie dotyczy listy, ale to samo odnosi się do krotek.
Jeśli liczba elementów nie jest zgodna z liczbą argumentów, wystąpi błąd typu 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
W przypadku funkcji z domyślnymi argumentami
Jeśli ustawiony jest argument domyślny, jest on używany, jeśli liczba elementów jest niewystarczająca. Jeśli liczba elementów jest zbyt duża, wystąpi błąd typu 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
W przypadku funkcji z argumentami o zmiennej długości
Jeśli ustawiony jest argument o zmiennej długości, wszystkie elementy po elemencie dla argumentu pozycyjnego są przekazywane do argumentu o zmiennej długości.
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')
Rozwiń (rozpakuj) słownik za pomocą ** (dwie gwiazdki)
Gdy słownik dict jest podany jako argument z **, klucze elementów są interpretowane jako nazwy argumentów, a wartości jako wartości argumentów, i każdy z nich jest przekazywany jako osobny argument.
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
Jeśli nie istnieje klucz pasujący do nazwy argumentu lub istnieje klucz, który nie pasuje, zostanie wyświetlony błąd typu 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'
W przypadku funkcji z domyślnymi argumentami
Obraz, w którym aktualizowane są tylko te wartości nazw argumentów, które pasują do kluczy w słowniku.
Klucz, który nie pasuje do nazwy argumentu, spowoduje wystąpienie błędu typu 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'
W przypadku funkcji z argumentami o zmiennej długości
Jeśli ustawiono argumenty o zmiennej długości, każdy element o kluczu innym niż nazwa argumentu podana jako argument jest przekazywany do argumentu o zmiennej długości.
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'}