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

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

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

Вопросы 1115 из 20

11Дана функция `def add(a, b, c): return a + b + c` и список `nums = [1, 2, 3]`. Что вернет вызов `add(*nums)`?
A`TypeError`
B6
C`(1, 2, 3)`
D1
Ответ: Оператор `*` при вызове функции распаковывает список в позиционные аргументы.

Вызов `add(*nums)` эквивалентен `add(1, 2, 3)`: элементы списка подставляются как позиционные аргументы. Поэтому результат — 6. Распаковка полезна, когда аргументы уже собраны в список/кортеж, но функция принимает их позиционно.

12Дана функция `def endpoint(path, **kwargs): return kwargs`. Что вернет вызов `endpoint('/users', limit=10, sort='asc')`?
A`['limit', 'sort']`
B`('limit', 10, 'sort', 'asc')`
C`{'limit', 'sort'}`
D`{'limit': 10, 'sort': 'asc'}`
Ответ: `**kwargs` собирает именованные аргументы в словарь `dict`.

Параметр `**kwargs` означает: «собери все именованные аргументы, которые не перечислены явно, в словарь». В примере `kwargs` будет `{'limit': 10, 'sort': 'asc'}`. Это удобно для функций-оберток, логирования, проброса опций и построения гибких API, но злоупотреблять этим не стоит: основные параметры лучше делать явными.

13Дана функция `def total(*args): return sum(args)`. Что вернет вызов `total(1, 2, 3)`?
A3
B`(1, 2, 3)`
C`[1, 2, 3]`
D6
Ответ: `*args` собирает позиционные аргументы в кортеж, а `sum(args)` суммирует их.

Параметр `*args` в определении функции означает: «собери все лишние позиционные аргументы в одну переменную `args`». Внутри функции `args` — это кортеж, например `(1, 2, 3)`. Затем `sum(args)` возвращает сумму элементов, то есть 6. Такой прием удобен, когда нужно принять переменное число значений.

14Что произойдет при выполнении `x = 1; def foo(): x = x + 1; return x; foo()`?
A`RecursionError`
B`AttributeError`
C`UnboundLocalError`
D`RuntimeError`
Ответ: Если внутри функции есть присваивание имени, Python считает его локальным; чтение до присваивания приводит к `UnboundLocalError`.

Внутри `foo()` есть присваивание `x = ...`, поэтому `x` считается локальной переменной. Но выражение справа `x + 1` пытается прочитать локальный `x` до того, как ему присвоено значение. Это приводит к `UnboundLocalError`. Чтобы изменить глобальную переменную, нужен `global x`, а чтобы избежать побочных эффектов — лучше возвращать новое значение и присваивать его снаружи.

15В коде `count = 0; def inc(): global count; count += 1; return count` зачем используется `global count`?
AЧтобы сделать `count` неизменяемым
BЧтобы скопировать `count` в локальную переменную
CЧтобы ускорить выполнение функции
DЧтобы указать, что `count` относится к глобальной области и его можно изменять внутри функции
Ответ: `global` нужен, когда внутри функции вы присваиваете значение глобальной переменной.

Если внутри функции есть присваивание `count += 1`, Python по умолчанию считает `count` локальным именем. Тогда попытка прочитать его до присваивания приведёт к ошибке. Команда `global count` говорит интерпретатору: «используй глобальную переменную `count`», и позволяет изменять её внутри функции. В большинстве случаев лучше избегать глобального состояния и возвращать новое значение, но иногда `global` нужен в простых скриптах.

1234

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

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

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

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

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