Функция с переменным количеством аргументов в Python: *args и **kwargs

python

В этой статье мы расскажем, зачем нужны  *args и **kwargs в Python и как их использовать.

В программировании, если нам нужно выполнять похожие действия, мы определяем функции для многоразового использования кода. Чтобы выполнить это действие, мы вызываем функцию с определённым значением — аргументом.

Предположим, у нас есть функция, которая складывает три числа:

def adder(x, y, z):
    print("sum:",x + y + z)

adder(10, 12, 13)

После запуска будет выведено sum: 35.

Во фрагменте кода выше у нас есть функция adder() с тремя аргументами: x, y и z. При передаче трёх значений этой функции на выходе мы получаем их сумму. Но что, если передать больше трёх аргументов в эту функцию?

def adder(x, y, z):
    print("sum: ",x + y + z)

adder(5, 10, 15, 20, 25)

Из-за того, что здесь мы передаём 5 аргументов, при запуске программы выводится ошибка TypeError: adder() takes 3 positional arguments but 5 were given.

 *args и **kwargs спешат на помощь

В Python можно передать переменное количество аргументов двумя способами:

  • *args для неименованных аргументов;
  • **kwargs для именованных аргументов.

Мы используем *args и **kwargs в качестве аргумента, когда заранее не известно, сколько значений мы хотим передать функции.

*args

Как было сказано, *args нужен, когда мы хотим передать неизвестное количество неименованных аргументов. Если поставить * перед именем, это имя будет принимать не один аргумент, а несколько. Аргументы передаются как кортеж и доступны внутри функции под тем же именем, что и имя параметра, только без *. Например:

def adder(*nums):
    sum = 0
    
    for n in nums:
        sum += n

    print("Sum: ", sum)

adder(3, 5)
adder(4, 5, 6, 7)
adder(1, 2, 3, 5, 6)

В результате выполнения программы мы получим следующий результат:

Sum: 8
Sum: 22
Sum: 17

Здесь мы использовали *num в качестве параметра, который позволяет передавать переменное количество аргументов в функцию adder(). Внутри функции мы проходимся в цикле по этим аргументам, чтобы найти их сумму, и выводим результат.

**kwargs

По аналогии с *args мы используем **kwargs для передачи переменного количества именованных аргументов. Схоже с *args, если поставить ** перед именем, это имя будет принимать любое количество именованных аргументов. Кортеж/словарь из нескольких переданных аргументов будет доступен под этим именем. Например:

def intro(**data):
    print("\nData type of argument: ",type(data))

    for key, value in data.items():
        print("{} is {}".format(key, value))

intro(Firstname="Sita", Lastname="Sharma", Age=22, Phone=1234567890)
intro(Firstname="John", Lastname="Wood", Email="johnwood@nomail.com", Country="Wakanda", Age=25, Phone=9876543210)

При запуске программы мы увидим следующее:

В этом случае у нас есть функция intro() с параметром **data. В функцию мы передали два словаря разной длины. Затем внутри функции мы прошлись в цикле по словарям, чтобы вывести их содержимое.

Что нужно запомнить:

    • *args и **kwargs — специальный синтаксис, позволяющий передавать в функцию переменное количество аргументов. При этом, совсем не обязательно использовать имена аргументов args и kwargs;
    • *args используется для неименованных аргументов, с которыми можно работать как со списком;
    • **kwargs используется для именованных аргументов, с которыми можно работать как со словарём;
    • если вы хотите использовать и *args, и **kwargs, то это делается так: func(fargs, *args, **kwargs), порядок следования аргументов важен;

Другие материалы по Python можно посмотреть у нас на сайте.

Перевод статьи «Python *args and **kwargs»

Наши тесты для вас:
Тест на знание сленга веб-разработчиков.
Что вы знаете о работе мозга?
А вы точно программист?