Что такое *args, **kwargs?

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


1. *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 — условное, можно назвать как угодно, но с **.

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.

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?