lambda и apply в Python на собеседовании
Что спрашивают по lambda и apply
lambda и apply — одна из самых частых тем на Python-собеседовании аналитика. Интервьюер проверяет два навыка: знание синтаксиса и понимание производительности. Написать lambda-функцию несложно, но объяснить, когда apply замедляет работу в десятки раз — это показывает зрелость.
Вопросы варьируются от простых («что такое lambda?») до практических («перепишите этот apply на векторизованные операции»). Для junior достаточно знать синтаксис, для middle — понимать, почему apply медленный и как его избежать.
lambda в Python — это анонимная функция в одну строку. На собеседовании важно не только знать синтаксис, но и понимать, когда lambda уместна, а когда лучше использовать обычную функцию.
lambda-функции
Синтаксис: lambda x: x * 2 — анонимная функция, которая принимает x и возвращает x * 2. Тело lambda — одно выражение, без операторов if/for (но тернарный оператор допустим: lambda x: 'yes' if x > 0 else 'no').
Где используется: чаще всего внутри sorted(), map(), filter() и pandas apply(). Назначение — короткие одноразовые функции, которые не стоит называть.
Типичный вопрос: Отсортируйте список словарей по ключу 'age'. Ответ: sorted(data, key=lambda x: x['age']). Интервьюер может попросить добавить обратную сортировку или сортировку по нескольким ключам.
Ограничения: lambda не может содержать несколько выражений, операторы присваивания или сложную логику. Если функция не помещается в одну строку — используйте def. На собеседовании правильно сказать: «lambda для простых случаев, def для всего остального».
map, filter и reduce
map(func, iterable) — применяет функцию к каждому элементу. list(map(lambda x: x**2, [1, 2, 3])) вернёт [1, 4, 9]. В современном Python предпочтительнее list comprehension: [x**2 for x in [1, 2, 3]].
filter(func, iterable) — оставляет элементы, для которых функция возвращает True. list(filter(lambda x: x > 0, [-1, 2, -3, 4])) вернёт [2, 4]. Аналог: [x for x in lst if x > 0].
reduce — свёртка списка в одно значение. Импортируется из functools. На практике используется редко — sum(), max(), min() покрывают большинство случаев.
На собеседовании могут попросить сравнить map/filter с list comprehension. Правильный ответ: comprehension читаемее и идиоматичнее в Python. map/filter оправданы, когда функция уже существует: list(map(str, numbers)).
apply в pandas: когда оправдан
df.apply(func) — применяет функцию к каждой строке или колонке DataFrame. Это удобно, но медленно: apply выполняет Python-цикл под капотом, теряя все преимущества векторизации.
Когда apply оправдан:
- Сложная логика, которую невозможно выразить через встроенные методы pandas
- Обработка строк с нестандартными правилами
- Прототипирование — быстро написать, потом оптимизировать
Когда apply не нужен:
- Арифметика:
df['total'] = df['price'] * df['qty']вместо apply - Условия:
np.where(df['age'] > 18, 'adult', 'child')вместо apply с lambda - Строковые операции:
df['name'].str.lower()вместо apply(lambda x: x.lower())
На собеседовании часто дают код с apply и просят оптимизировать. Главное правило: если операцию можно выполнить через встроенные методы pandas или numpy — делайте так. Это быстрее в 10-100 раз.
Типичные задачи
Задача 1: Создать колонку категории по числовому значению. Плохо: df['cat'] = df['value'].apply(lambda x: 'high' if x > 100 else 'low'). Лучше: df['cat'] = np.where(df['value'] > 100, 'high', 'low'). Для множества категорий — pd.cut().
Задача 2: Извлечь домен из email. Плохо: df['domain'] = df['email'].apply(lambda x: x.split('@')[1]). Лучше: df['domain'] = df['email'].str.split('@').str[1].
Задача 3: Применить функцию к группам. df.groupby('city')['salary'].transform('mean') вместо df.groupby('city')['salary'].apply(lambda x: x.mean()). transform сохраняет индекс и работает быстрее.
FAQ
Когда использовать lambda, а когда def?
lambda — для коротких одноразовых функций в одно выражение. Если функция используется повторно, содержит несколько строк или нуждается в документации — def. На собеседовании покажите, что вы понимаете границу: «lambda — для удобства, def — для читаемости».
Почему apply медленный?
apply выполняет Python-цикл по строкам DataFrame. Каждая итерация — вызов Python-функции с накладными расходами. Векторизованные операции pandas и numpy работают на уровне C, обрабатывая массив целиком без Python-цикла. Разница на миллионе строк — секунды против минут.
Спрашивают ли map/filter/reduce на собеседовании аналитика?
map и filter спрашивают часто — обычно в контексте «перепишите через comprehension». reduce — редко, это скорее тема для разработчиков. Для аналитика важнее знать pandas-аналоги: groupby, transform, apply. Общие советы — в разделе подготовка.