Позиционные и именованные аргументы, *args, **kwargs, значения по умолчанию, замыкания, lambda — всё это спрашивают на собеседованиях. Частая ловушка — мутабельный объект как значение по умолчанию. Умение декомпозировать код на функции и правильно работать с аргументами — признак зрелого разработчика.
Вызов `add(*nums)` эквивалентен `add(1, 2, 3)`: элементы списка подставляются как позиционные аргументы. Поэтому результат — 6. Распаковка полезна, когда аргументы уже собраны в список/кортеж, но функция принимает их позиционно.
Параметр `**kwargs` означает: «собери все именованные аргументы, которые не перечислены явно, в словарь». В примере `kwargs` будет `{'limit': 10, 'sort': 'asc'}`. Это удобно для функций-оберток, логирования, проброса опций и построения гибких API, но злоупотреблять этим не стоит: основные параметры лучше делать явными.
Параметр `*args` в определении функции означает: «собери все лишние позиционные аргументы в одну переменную `args`». Внутри функции `args` — это кортеж, например `(1, 2, 3)`. Затем `sum(args)` возвращает сумму элементов, то есть 6. Такой прием удобен, когда нужно принять переменное число значений.
Внутри `foo()` есть присваивание `x = ...`, поэтому `x` считается локальной переменной. Но выражение справа `x + 1` пытается прочитать локальный `x` до того, как ему присвоено значение. Это приводит к `UnboundLocalError`. Чтобы изменить глобальную переменную, нужен `global x`, а чтобы избежать побочных эффектов — лучше возвращать новое значение и присваивать его снаружи.
Если внутри функции есть присваивание `count += 1`, Python по умолчанию считает `count` локальным именем. Тогда попытка прочитать его до присваивания приведёт к ошибке. Команда `global count` говорит интерпретатору: «используй глобальную переменную `count`», и позволяет изменять её внутри функции. В большинстве случаев лучше избегать глобального состояния и возвращать новое значение, но иногда `global` нужен в простых скриптах.
В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать в Telegram