Вопрос12
Осталось:

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

Образцовый ответ

Показывать ответ по умолчанию

*args — произвольное число позиционных аргументов:

Собирает все лишние позиционные аргументы в кортеж:

def total(*args):
    return sum(args)

total(1, 2, 3)      # 6
total(10, 20)        # 30

**kwargs — произвольное число именованных аргументов:

Собирает все лишние именованные аргументы в словарь:

def build_profile(**kwargs):
    return kwargs

build_profile(name="Анна", age=25, city="Москва")
# {'name': 'Анна', 'age': 25, 'city': 'Москва'}

Комбинирование:

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

def func(a, b, *args, **kwargs):
    print(f"a={a}, b={b}")
    print(f"args={args}")
    print(f"kwargs={kwargs}")

func(1, 2, 3, 4, x=10, y=20)
# a=1, b=2
# args=(3, 4)
# kwargs={'x': 10, 'y': 20}

Распаковка при вызове:

def greet(name, age):
    print(f"{name}, {age} лет")

args_list = ["Анна", 25]
greet(*args_list)      # Распаковка списка

kwargs_dict = {"name": "Иван", "age": 30}
greet(**kwargs_dict)   # Распаковка словаря