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. Общие советы — в разделе подготовка.

Смотрите также