Что такое функция высшего порядка в Python
Что проверяют
Базовое понимание того, что функция это такое же значение, как число или строка. Вопрос про Python на собеседовании по Android обычно возникает вокруг вспомогательных задач (скрипты сборки, обработка отчётов), и смотрят не на знание конкретной библиотеки, а на то, переносите ли вы понятие в язык, на котором пишете каждый день.
Как отвечать
Функция высшего порядка принимает функцию аргументом, возвращает функцию результатом или делает и то и другое.
def apply_twice(func, value):
return func(func(value))
def make_multiplier(factor):
def multiply(x):
return x * factor # factor захвачен замыканием
return multiply
apply_twice(make_multiplier(3), 2) # 18Встроенные примеры в Python: map, filter, sorted с параметром key, декораторы. Дальше уместно перенести понятие на Kotlin, где тот же механизм работает постоянно: лямбда в map и filter, функции области видимости вроде let и apply, функция параметром вместо интерфейса с единственным методом. Разница в цене: помеченная inline функция высшего порядка разворачивается в месте вызова, и объекта лямбды не возникает вовсе, что заметно в горячем коде и в списках. В Python такой оптимизации нет, вызов остаётся вызовом.
Где спотыкаются
Передают результат вместо функции: пишут apply_twice(square(2), 2) и получают ошибку либо неожиданное поведение. Скобки означают вызов, а объект функции передаётся именем без скобок.
Ставят знак равенства между функцией высшего порядка и лямбдой. Лямбда это просто короткая запись безымянной функции, высший порядок это про то, что функция ходит как значение, и обычное определение через def подходит ровно так же.
Считают, что map и filter возвращают список. В Python это ленивые итераторы: значения вычисляются при обходе, после первого прохода итератор пуст, поэтому результат оборачивают в list, когда нужен повторный доступ.