В 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'}