*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 мы можем передавать переменное число аргументов в функцию с помощью специальных символов. Существует два специальных символа:
*args (неключевые аргументы)
**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 делают функцию гибкой.