В Python списъците (масиви), кортежите и речниците могат да бъдат разширявани (разопаковани) и съответните им елементи могат да бъдат предавани заедно като аргументи на функции.
Когато извиквате функция, посочете аргумента с * за списъци и кортежи и с ** за речници. Обърнете внимание на броя на звездичките *.
Тук са описани следните подробности.
- Разширяване (разопаковане) на списък или кортеж с * (една звездичка)
- За функции с аргументи по подразбиране
- За функции с аргументи с променлива дължина
- Разширяване (разопаковане) на речника с ** (две звездички)
- За функции с аргументи по подразбиране
- За функции с аргументи с променлива дължина
Вижте следната статия за основната употреба на функциите на Python, аргументите по подразбиране и аргументите с променлива дължина с *,** при дефиниране на функции.
- СВЪРЗАНИ:Как да използваме и отбелязваме аргументи по подразбиране във функциите на Python
- СВЪРЗАНИ:Как да използваме аргументи с променлива дължина в Python(
*args
,**kwargs
)
Разширяване (разопаковане) на списък или кортеж с * (една звездичка)
Когато списък или кортеж е зададен като аргумент с *, той се разширява и всеки елемент се предава като отделен аргумент.
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
Следващото обяснение е за списък, но същото важи и за кортеж.
Ако броят на елементите не съвпада с броя на аргументите, се появява грешка 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
За функции с аргументи по подразбиране
Ако е зададен аргумент по подразбиране, той се използва, ако броят на елементите е недостатъчен. Ако броят на елементите е твърде голям, се появява грешка 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
За функции с аргументи с променлива дължина
Ако е зададен аргумент с променлива дължина, всички елементи след елемента за позиционния аргумент се предават на аргумента с променлива дължина.
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')
Разширяване (разопаковане) на речника с ** (две звездички)
Когато речник dict е зададен като аргумент със символа **, ключовете на елементите се разширяват като имена на аргументи, а стойностите – като стойности на аргументи, и всеки от тях се предава като отделен аргумент.
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
Ако няма ключ, който да съответства на името на аргумента, или има ключ, който не съответства, ще се получи грешка 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'
За функции с аргументи по подразбиране
Изображение, в което се актуализират само стойностите на имената на аргументите, които съответстват на ключовете в речника.
Ключ, който не съответства на името на аргумента, ще доведе до грешка 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'
За функции с аргументи с променлива дължина
Ако са зададени аргументи с променлива дължина, всеки елемент с ключ, различен от името на аргумента, посочено като аргумент, се предава на аргумента с променлива дължина.
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'}