*args, **kwargs
@Pycoders
Думаю, многие хоть раз видели такую запись, сейчас мы узнаем, что это за магические символы. Сообщу заранее, что args и kwargs - общепринятые имена переменных, а разбирать мы будем звездочки перед нимим.
def func(*args, **kwargs):
# code
*args
Рассмотрим на примере, чтобы сразу же понять, как и где это используется. Создадим самую простую функцию, которая складывает два значение.
def add(a, b):
print(a + b)
add(2, 2)
# Output: 4
Вроде бы всё хорошо, но что если мы захотим сложить не два числа, а три, четыре или даже больше? Вот здесь и понадобится конструкция со звездочкой (по-умному астерикс, а не звездочка). Напоминаю, что вместо args вы можете написать любое другое имя вашей переменной, однако именно args является наиболее популярным вариантом.
Итак, если поставить * в определении функции, то переменная будет принимать не один аргумент, а сколько угодно. Аргументы передаются как кортеж и доступны внутри функции под тем же именем, что и имя параметра, только без *.
def add(*args):
print(sum(args))
add(2, 2, 5, 7, 4)
# Output: 20
А теперь представим, что мы хотим передать готовый список в нашу функцию, для этого надо поставить звездочку перед самим списком при вызове функции, иначе получим ошибку.
nums = [2, 2, 5, 7, 4] add(*nums) # Output: 20
Будьте внимательны, при использовании такой конструкции могут возникнуть недопонимания с позиционными аргументами и генераторами.
**kwargs
Здесь ничего особенного, просто упаковка именованных аргументов в словарь.
def func(**kwargs):
print(kwargs)
func(name='Alan', age=22, male=True)
# Output: {'name': 'Alan', 'age': 22, 'male': True}
Итог
В целом, конструкция с *args, **kwargs получается достаточно полезной, если мы не знаем, кто и в каких целях будет использовать нашу функцию. То есть, мы можем запихнуть в аргументы после такого практически всё.
- *args для неименованных аргументов;
- **kwargs для именованных аргументов.