> For the complete documentation index, see [llms.txt](https://kaze.gitbook.io/qa-theory/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kaze.gitbook.io/qa-theory/osnovy-programmirovaniya-na-python/chto-takoe-args-kwargs.md).

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

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

***

### **1. `*args` — произвольное количество позиционных аргументов**

* Собирает все **позиционные аргументы** в **кортеж**.
* Имя `args` условное — можно написать `*values`, `*items` и т.п., но звёздочка обязательна.

```python
def my_func(*args):
    print(args)

my_func(1, 2, 3)  
# (1, 2, 3)
```

Можно итерироваться:

```python
def sum_all(*args):
    return sum(args)

print(sum_all(1, 2, 3, 4))  # 10
```

***

### **2. `**kwargs` — произвольное количество именованных аргументов**

* Собирает все **именованные аргументы** в **словарь**.
* Имя `kwargs` — условное, можно назвать как угодно, но с `**`.

```python
def my_func(**kwargs):
    print(kwargs)

my_func(name="Kakha", age=30)  
# {'name': 'Kakha', 'age': 30}
```

Можно обращаться по ключам:

```python
def greet(**kwargs):
    print(f"Hello, {kwargs['name']}!")

greet(name="Kakha")  # Hello, Kakha!
```

***

### **3. Комбинация `*args` и `**kwargs`**

* Можно принимать и позиционные, и именованные аргументы вместе.
* Порядок важен: обычные аргументы → `*args` → аргументы с дефолтом → `**kwargs`.

```python
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. Распаковка при вызове функции**

* `*` распаковывает **списки/кортежи** в позиционные аргументы.
* `**` распаковывает **словари** в именованные аргументы.

```python
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 не сможет понять, где заканчиваются позиционные и начинаются именованные аргументы.
