Позиционные и именованные аргументы, *args, **kwargs, значения по умолчанию, замыкания, lambda — всё это спрашивают на собеседованиях. Частая ловушка — мутабельный объект как значение по умолчанию. Умение декомпозировать код на функции и правильно работать с аргументами — признак зрелого разработчика.
Всего в этом разделе 20 вопросов. Каждый — с правильным ответом и кратким разбором теории. Разбито на 4 части по 5 вопросов.
Параметр `exp=2` означает, что если `exp` не указан при вызове, он равен 2. Поэтому `power(3)` вычисляет `3 ** 2` и возвращает 9. Значения по умолчанию помогают делать API функции удобнее: чаще всего используемый вариант вызова получается короче.
Функция `f` вызывает `print(x)`, поэтому на экран будет выведено число 3. Но возвращаемого значения нет, значит неявно возвращается `None`. Поэтому `res = f(3)` присваивает `res` значение `None`. В аналитическом коде это важно: функции, которые должны участвовать в вычислениях, должны возвращать данные через `return`, а не только печатать.
Функция определена через `def`, а результат вычисления выражения после `return` становится значением вызова функции. В примере `add(2, 3)` вернет 5, потому что складываются два числа. Это базовый паттерн: вычислять результат и явно возвращать его через `return`, чтобы дальше использовать в коде.
В `discount(120)` условие `total >= 100` истинно, поэтому выполняется `return 10` и функция сразу завершается. Второй `return 0` уже не выполняется. Это типичный паттерн: быстро вернуть результат для частого/важного случая и выйти из функции.
В Python позиционные аргументы должны идти до именованных. Вызов `f(1, b=2, 3)` нарушает это правило: после `b=2` идет позиционный `3`. Такой код приводит к ошибке вида «positional argument follows keyword argument». Остальные варианты корректны, потому что либо все позиционные, либо все именованные, либо позиционные идут перед именованными.
В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать в Telegram