Что такое *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)) # 10
2. **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?