*args и **kwargs в Python

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

Рекомендуется прочитать Функции в Python и Аргументы функций в Python.

Допустим, мы определяем функцию для сложения 3 чисел.

Пример 1: функция сложения 3 чисел

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

adder(10,12,13)

При выполнении этой программы вывод будет:

sum: 35

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


Посмотрим, что произойдёт при передаче более 3 аргументов в функцию adder().

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

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

При выполнении этой программы вывод будет:

TypeError: adder() takes 3 positional arguments but 5 were given

В программе выше мы передали 5 аргументов в функцию adder() вместо 3, из-за чего получили TypeError.


Введение в *args и **kwargs

В Python мы можем передавать переменное число аргументов в функцию с помощью специальных символов. Существует два специальных символа:

  1. *args (неключевые аргументы)

  2. **kwargs (ключевые аргументы)

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


*args в Python

Как в примере выше, мы не уверены в количестве аргументов, которые можно передать в функцию. В Python есть *args, что позволяет передавать переменное число неключевых аргументов в функцию.

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

Пример 2: использование *args для передачи аргументов переменной длины в функцию

def adder(*num):
    sum = 0

    for n in num:
        sum = 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(). Внутри функции есть цикл, который складывает переданный аргумент и выводит результат. Мы передали 3 различных кортежа переменной длины в качестве аргумента функции.


**kwargs в Python

Python передаёт неключевые аргументы переменной длины в функцию через *args, но мы не можем использовать это для передачи ключевых аргументов. Для этой задачи в Python есть решение — **kwargs, позволяющее передавать ключевые аргументы переменной длины в функцию.

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

Пример 3: использование **kwargs для передачи переменных ключевых аргументов в функцию

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)

При выполнении этой программы вывод будет:

Data type of argument: <class 'dict'>
Firstname is Sita
Lastname is Sharma
Age is 22
Phone is 1234567890

Data type of argument: <class 'dict'>
Firstname is John
Lastname is Wood
Email is johnwood@nomail.com
Country is Wakanda
Age is 25
Phone is 9876543210

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


О чём нужно помнить

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

  • *args передаёт переменное число неключевых аргументов, над которыми можно выполнять операции кортежа.

  • **kwargs передаёт переменное число ключевых аргументов в виде словаря в функцию, над которым можно выполнять операции словаря.

  • *args и **kwargs делают функцию гибкой.