Функции и аргументы: вопросы для собеседования (часть 2)

Позиционные и именованные аргументы, *args, **kwargs, значения по умолчанию, замыкания, lambda — всё это спрашивают на собеседованиях. Частая ловушка — мутабельный объект как значение по умолчанию. Умение декомпозировать код на функции и правильно работать с аргументами — признак зрелого разработчика.

Коллекции и структуры данныхГенераторы списков и встроенные функцииЦиклы и условияИсключения и отладкаРабота с файлами: JSON и CSVИтераторы и генераторыNumPy: основыPandas и DataFrameСинтаксис и типы данных

Вопросы 610 из 20

6Есть функция `def profile(name, country='RU', city='Moscow'): return f'{name}:{country}:{city}'`. Что вернёт вызов `profile('Ann', city='Kazan')`?
A`'Ann:Kazan:RU'`
B`'Ann:RU:Kazan'`
C`'Ann:RU:Moscow'`
D`TypeError`
Ответ: Именованный аргумент позволяет переопределить конкретный параметр, не меняя остальные дефолты.

Вызов `profile('Ann', city='Kazan')` передаёт `name` позиционно, а `city` — по имени. Параметр `country` не указан, поэтому берётся значение по умолчанию `'RU'`. Итоговая строка будет `'Ann:RU:Kazan'`. Именованные аргументы повышают читаемость, особенно когда у функции много параметров с дефолтами.

7Дан код: `x = 10; def inc(): return x + 1`. Что вернёт вызов `inc()`?
A11
B10
C`NameError`
D`UnboundLocalError`
Ответ: Если внутри функции переменная только читается, Python может взять ее из глобальной области (по LEGB).

По правилу области видимости (LEGB) Python ищет имя сначала в локальной области функции, затем во внешних, затем в глобальной и встроенной. В `inc()` переменная `x` не присваивается, а только читается, поэтому берется глобальное `x = 10`. Результат `x + 1` равен 11.

8Дана функция `def f(a, b, c): return a * 100 + b * 10 + c`. Что вернет вызов `f(1, c=3, b=2)`?
A132
B123
C`TypeError`
D321
Ответ: Позиционные аргументы заполняют параметры слева направо, именованные можно указывать в любом порядке по имени.

В вызове `f(1, c=3, b=2)` значение 1 идет в параметр `a` (позиционно). Параметры `b` и `c` задаются именованно, поэтому порядок `b=2` и `c=3` не важен. В итоге считается `1 * 100 + 2 * 10 + 3`, то есть 123. Это частый стиль: обязательные параметры передают позиционно, а уточняющие — ключевыми аргументами.

9Есть функция `def f(a, b): return a + b`. Что произойдет при вызове `f(1, a=2)`?
A3
B2
C`TypeError`
DСработает `a=2`, а позиционный аргумент будет проигнорирован
Ответ: Нельзя передать один и тот же параметр дважды (позиционно и по имени).

Вызов `f(1, a=2)` передает значение для параметра `a` дважды: сначала позиционно (1), затем именованно (`a=2`). Python не может выбрать «какое правильное» и выбрасывает ошибку вида `TypeError: got multiple values for argument`. Это частая ошибка при смешанном стиле вызовов.

10Дана функция `def split_total(total): return total // 100, total % 100`. Что вернет вызов `split_total(250)`?
A`(2, 50)`
B`(250, 0)`
C`[2, 50]`
D`TypeError`
Ответ: Функция может вернуть несколько значений — фактически это один `tuple`.

Выражение после `return` содержит два значения через запятую, значит возвращается кортеж `tuple`. Для 250: `250 // 100` равно 2, а `250 % 100` равно 50. Итог — `(2, 50)`. Такой стиль часто используют для возврата связанных результатов, которые затем можно распаковать: `a, b = split_total(250)`.

1234

Хотите тренировать интерактивно?

В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.

Тренировать в Telegram

Другие темы: Python

Коллекции и структуры данныхГенераторы списков и встроенные функцииЦиклы и условияИсключения и отладкаРабота с файлами: JSON и CSVИтераторы и генераторыNumPy: основыPandas и DataFrameСинтаксис и типы данных