Что такое *args, **kwargs?
В Python *args и **kwargs — это специальные конструкции, позволяющие функции принимать произвольное количество аргументов.
1. *args — произвольное количество позиционных аргументов
*args — произвольное количество позиционных аргументовСобирает все позиционные аргументы в кортеж.
Имя
argsусловное — можно написать*values,*itemsи т.п., но звёздочка обязательна.
def my_func(*args):
print(args)
my_func(1, 2, 3)
# (1, 2, 3)Можно итерироваться:
def sum_all(*args):
return sum(args)
print(sum_all(1, 2, 3, 4)) # 102. **kwargs — произвольное количество именованных аргументов
**kwargs — произвольное количество именованных аргументовСобирает все именованные аргументы в словарь.
Имя
kwargs— условное, можно назвать как угодно, но с**.
def my_func(**kwargs):
print(kwargs)
my_func(name="Kakha", age=30)
# {'name': 'Kakha', 'age': 30}Можно обращаться по ключам:
def greet(**kwargs):
print(f"Hello, {kwargs['name']}!")
greet(name="Kakha") # Hello, Kakha!3. Комбинация *args и **kwargs
*args и **kwargsМожно принимать и позиционные, и именованные аргументы вместе.
Порядок важен: обычные аргументы →
*args→ аргументы с дефолтом →**kwargs.
def func(a, b, *args, c=10, **kwargs):
print(f"a={a}, b={b}, args={args}, c={c}, kwargs={kwargs}")
func(1, 2, 3, 4, 5, c=20, x=100, y=200)
# a=1, b=2, args=(3, 4, 5), c=20, kwargs={'x': 100, 'y': 200}4. Распаковка при вызове функции
*распаковывает списки/кортежи в позиционные аргументы.**распаковывает словари в именованные аргументы.
def show(a, b, c):
print(a, b, c)
nums = [1, 2, 3]
show(*nums) # 1 2 3
params = {"a": 1, "b": 2, "c": 3}
show(**params) # 1 2 3💡 На собеседованиях любят спросить:
Почему
*argsидёт перед**kwargsв определении функции? → Потому что иначе Python не сможет понять, где заканчиваются позиционные и начинаются именованные аргументы.
Last updated
Was this helpful?