Позиционные и именованные аргументы, *args, **kwargs, значения по умолчанию, замыкания, lambda — всё это спрашивают на собеседованиях. Частая ловушка — мутабельный объект как значение по умолчанию. Умение декомпозировать код на функции и правильно работать с аргументами — признак зрелого разработчика.
Изменяемые дефолты (список, словарь, множество) создаются один раз и переиспользуются. Чтобы избежать общих побочных эффектов между вызовами, обычно ставят `items=None`, а внутри делают инициализацию: `items = [] if items is None else items`. Тогда при каждом вызове без `items` создаётся новый список, и данные не «накапливаются» неожиданно.
Подробный разбор →Вариант `def render_page(template, **options): return render(template, **options)` сохраняет читаемость: сразу видно обязательный `template`. При этом `**options` позволяет пробросить любые дополнительные именованные параметры дальше. Полностью «универсальный» `*args, **kwargs` иногда нужен, но ухудшает понимание интерфейса, если у функции есть очевидные обязательные аргументы.
Подробный разбор →Если обязательные параметры важны для понимания кода, их стоит прописать явно в сигнатуре: так легче читать, есть автодополнение, меньше ошибок при вызове. При этом дополнительные редкие поля удобно принимать через `**kwargs` как словарь метаданных. Полностью «все через `**kwargs`» ухудшает читаемость и усложняет контроль входных данных.
Подробный разбор →Значение по умолчанию для `items` (пустой список) создается в момент определения функции, а не при каждом вызове. Поэтому `add_item('a')` добавляет `'a'` в тот же список, который затем используется и во втором вызове. Второй вызов `add_item('b')` добавит `'b'` в этот же список и вернет `['a', 'b']`. Это частая ловушка со значениями по умолчанию.
Подробный разбор →Сигнатура `def mean(values): ...` позволяет передавать список, кортеж или любой другой итерируемый объект напрямую (например, `mean(values)`), без распаковки. Вариант `def mean(*values): ...` удобен, когда вызывают как `mean(1, 2, 3)`, но хуже подходит для данных, которые уже собраны в коллекции. При проектировании функций для аналитики чаще выигрывает явный параметр `values`.
Подробный разбор →В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать Python в Telegram