Позиционные и именованные аргументы, *args, **kwargs, значения по умолчанию, замыкания, lambda — всё это спрашивают на собеседованиях. Частая ловушка — мутабельный объект как значение по умолчанию. Умение декомпозировать код на функции и правильно работать с аргументами — признак зрелого разработчика.
Вызов `profile('Ann', city='Kazan')` передаёт `name` позиционно, а `city` — по имени. Параметр `country` не указан, поэтому берётся значение по умолчанию `'RU'`. Итоговая строка будет `'Ann:RU:Kazan'`. Именованные аргументы повышают читаемость, особенно когда у функции много параметров с дефолтами.
По правилу области видимости (LEGB) Python ищет имя сначала в локальной области функции, затем во внешних, затем в глобальной и встроенной. В `inc()` переменная `x` не присваивается, а только читается, поэтому берется глобальное `x = 10`. Результат `x + 1` равен 11.
В вызове `f(1, c=3, b=2)` значение 1 идет в параметр `a` (позиционно). Параметры `b` и `c` задаются именованно, поэтому порядок `b=2` и `c=3` не важен. В итоге считается `1 * 100 + 2 * 10 + 3`, то есть 123. Это частый стиль: обязательные параметры передают позиционно, а уточняющие — ключевыми аргументами.
Вызов `f(1, a=2)` передает значение для параметра `a` дважды: сначала позиционно (1), затем именованно (`a=2`). Python не может выбрать «какое правильное» и выбрасывает ошибку вида `TypeError: got multiple values for argument`. Это частая ошибка при смешанном стиле вызовов.
Выражение после `return` содержит два значения через запятую, значит возвращается кортеж `tuple`. Для 250: `250 // 100` равно 2, а `250 % 100` равно 50. Итог — `(2, 50)`. Такой стиль часто используют для возврата связанных результатов, которые затем можно распаковать: `a, b = split_total(250)`.
В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать в Telegram