Что такое lambda?
lambda — способ создать анонимную функцию в одну строку:
square = lambda x: x ** 2
print(square(5)) # 25
Это полный эквивалент:
def square(x):
return x ** 2
Синтаксис
lambda параметры: выражение
- Только одно выражение (не несколько операторов)
- Неявный
return - Можно несколько параметров:
lambda x, y: x + y
map() — применить функцию к каждому элементу
numbers = [1, 2, 3, 4, 5]
squares = list(map(lambda x: x ** 2, numbers))
print(squares) # [1, 4, 9, 16, 25]
То же самое через list comprehension (обычно предпочтительнее):
squares = [x ** 2 for x in numbers]
filter() — отфильтровать список
numbers = [1, 2, 3, 4, 5, 6]
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens) # [2, 4, 6]
sorted() с key=
Это самый частый и обоснованный случай применения lambda:
words = ["banana", "apple", "cherry", "date"]
sorted_words = sorted(words, key=lambda w: len(w))
print(sorted_words) # ['date', 'apple', 'banana', 'cherry']
Сортировка списка словарей:
students = [
{"name": "Alice", "grade": 90},
{"name": "Bob", "grade": 85},
{"name": "Carol", "grade": 92},
]
top = sorted(students, key=lambda s: s["grade"], reverse=True)
print(top[0]["name"]) # Carol
Когда lambda уместна
✅ Хорошо: в аргументах key=, sort(), sorted(), max(), min():
pairs = [(1, "b"), (3, "a"), (2, "c")]
pairs.sort(key=lambda p: p[1]) # сортировка по второму элементу
✅ Хорошо: короткие однострочные callback'и:
from functools import reduce
product = reduce(lambda x, y: x * y, [1, 2, 3, 4, 5]) # 120
Когда НЕ стоит использовать lambda
❌ Плохо: сложная логика в lambda трудно читается:
# Не делайте так:
f = lambda x: x ** 2 if x > 0 else -x if x < 0 else 0
# Лучше:
def f(x):
if x > 0:
return x ** 2
elif x < 0:
return -x
return 0
❌ Плохо: присваивание lambda переменной (PEP 8 запрещает):
# PEP 8 говорит: используй def
double = lambda x: x * 2 # ❌
def double(x): # ✅
return x * 2
Lambda с несколькими аргументами
multiply = lambda x, y: x * y
print(multiply(3, 4)) # 12
# С default значением
greet = lambda name, greeting="Привет": f"{greeting}, {name}!"
print(greet("Alice")) # Привет, Alice!
print(greet("Bob", "Здравствуй")) # Здравствуй, Bob!
Практические примеры
Группировка данных
from itertools import groupby
data = [("alice", 1), ("bob", 2), ("alice", 3), ("bob", 4)]
data.sort(key=lambda x: x[0])
for name, items in groupby(data, key=lambda x: x[0]):
values = [v for _, v in items]
print(f"{name}: {values}")
# alice: [1, 3]
# bob: [2, 4]
Минимальный элемент по критерию
products = [
{"name": "Ноутбук", "price": 50000},
{"name": "Мышь", "price": 1500},
{"name": "Монитор", "price": 25000},
]
cheapest = min(products, key=lambda p: p["price"])
print(cheapest["name"]) # Мышь
Итог
| Ситуация | Использовать lambda? |
|---|---|
key= в sorted/max/min | ✅ Да |
| Простой однострочный callback | ✅ Да |
| Сложная логика | ❌ Нет, используй def |
| Присваивание переменной | ❌ Нет, PEP 8 |
| Несколько операторов | ❌ Невозможно |
Lambda — удобный инструмент для коротких операций, но не замена обычным функциям.