Что делает функция и какие у нее параметры
Что проверяют
Различаете ли вы параметр и аргумент, знаете ли все виды параметров в Python и понимаете ли, что происходит при вызове. Вопрос звучит на скрининге и почти всегда по конкретному коду: вашему тестовому или фрагменту на экране. Проверяют не заучивание, а способность прочитать сигнатуру и сказать, как её можно вызвать.
Как отвечать
Параметр это имя в объявлении, аргумент это значение, переданное при вызове. Виды параметров:
- позиционные и именованные:
add(3, 5)иadd(b=5, a=3); - со значением по умолчанию:
def multiply(a, b=1), значение вычисляется один раз при определении функции; - переменной длины:
*argsсобирает лишние позиционные в кортеж,**kwargsсобирает лишние именованные в словарь; - только именованные: всё, что стоит после
*в сигнатуре, передаётся исключительно по имени; - только позиционные: всё, что стоит до
/, по имени передать нельзя.
Полная форма выглядит так: def f(a, /, b, *args, c, d=0, **kwargs). Функция всегда что-то возвращает: без return это None. Аннотации типов интерпретатор не проверяет, они для читателя и статических анализаторов.
Где спотыкаются
Изменяемое значение по умолчанию. В def push(x, acc=[]) список создаётся один раз, при определении функции, и накапливает значения между вызовами. Правильный приём: acc=None, а внутри if acc is None: acc = [].
Говорят «Python передаёт по значению» или «по ссылке». Передаётся ссылка на объект, поэтому lst.append(1) внутри функции виден снаружи, а lst = [1] нет: это переприсваивание локального имени.
Считают, что аннотация типа что-то гарантирует в рантайме, и что *args поймает именованные аргументы. Ни того, ни другого нет: вызов f(x=1) при сигнатуре def f(*args) упадёт с TypeError.