Развернутое объяснение
Зачем нужны *args и **kwargs? Иногда заранее неизвестно, сколько аргументов понадобится функции: два, три или десять. В таких случаях используют переменное число аргументов. Python даёт для этого два специальных механизма:
*args — для дополнительного списка позиционных аргументов;
**kwargs — для дополнительного набора именованных аргументов (пара имя=значение).
На собеседованиях важно показать, что вы понимаете именно идею: «сделать функцию более гибкой по количеству входных параметров».
Что такое *args?
*args в определении функции означает: «Собери все дополнительные позиционные аргументы в один кортеж с именем args». Пример:
def avg(*args):
return sum(args) / len(args)
avg(1, 2, 3) # 2.0
avg(10, 20, 30, 40) # 25.0Особенности, которые полезно озвучить:
Внутри функции args — это кортеж. Можно комбинировать обычные параметры и *args, но обычные параметры должны идти до *args.
def log(prefix, *messages):
for msg in messages:
print(prefix, msg)
log("[INFO]", "start", "processing", "done")Что такое **kwargs?
**kwargs в определении функции означает: «Собери все дополнительные именованные аргументы в словарь с именем kwargs». Пример:
def create_user(**kwargs):
# kwargs — словарь
return kwargs
create_user(name="Alex", age=30, role="admin")
# {'name': 'Alex', 'age': 30, 'role': 'admin'}Важные моменты:
Внутри функции kwargs — это словарь. Имена ключей совпадают с именами аргументов, переданных при вызове. Частый практический сценарий в backend: проксировать параметры дальше, например, в конструктор или базовую функцию:
def wrapped_request(url, **options):
options.setdefault("timeout", 5)
return http_request(url, **options)Совместное использование и порядок аргументов
В одной функции можно использовать и *args, и **kwargs, но порядок параметров важен. Правило таково: сначала обычные позиционные параметры, далее *args. Далее именованные параметры (если есть) и наконец **kwargs. Пример:
def handle_request(method, url, *args, retry=3, **kwargs):
...Такое объявление позволяет функции быть гибкой и по количеству обычных аргументов, и по набору именованных настроек.
Как сформулировать ответ на собеседовании?
*args и **kwargs позволяют функции принимать переменное число аргументов. *args собирает дополнительные позиционные аргументы в кортеж, а **kwargs — дополнительные именованные аргументы в словарь. Это удобно, когда заранее неизвестно, сколько параметров придёт в функцию или когда нужно прозрачно прокинуть аргументы дальше.
Такой ответ показывает, что ты понимаешь не только синтаксис, но и практический смысл — именно это мы отрабатываем в задачах и проектах на TeoBrain, где *args и **kwargs часто используются в декораторах, обёртках и общих инфраструктурных функциях.