Перейти к содержимому
Editor

Лямбда-функции в Python: когда их использовать, а когда нет

Средний20 min5 упр.70 XP

Этот урок переведён с английского оригинала.Read in EnglishLeer en españolСообщить об ошибке в переводе

0/5 упр.

Представьте, что вам нужно оставить кому-то короткую записку: «Вернусь через 5 минут». Вы не станете писать официальное письмо с приветствием, тремя абзацами и подписью. Вы черкнёте пару слов на стикере, и готово.

Лямбда-функции и есть стикеры Python. Это крошечные анонимные одноразовые функции на случай, когда нужна короткая функция в одну строку, а полноценный блок def был бы излишеством.

В этом уроке вы научитесь писать лямбда-функции, узнаете, где они особенно хороши (сортировка, фильтрация, преобразование элементов), и, что не менее важно, когда от них лучше отказаться в пользу обычной функции.

Как написать лямбда-функцию

Лямбда-функцию создают с помощью ключевого слова lambda, за которым идут параметры, двоеточие и одно выражение. Значение этого выражения возвращается автоматически, ключевое слово return не нужно.

lambda и def: один и тот же результат
# Regular function
def double(x):
return x * 2
# Same thing as a lambda
double_lambda = lambda x: x * 2
print(double(5))
print(double_lambda(5))
Вывод
10
10

Синтаксис такой: lambda parameters: expression. У функции нет имени (поэтому такие функции и называют «анонимными»), нет def, нет return и нет тела из нескольких строк. Только одно выражение, которое вычисляется и возвращается.

Лямбды могут принимать несколько параметров, как и обычные функции:

Лямбда с несколькими параметрами
add = lambda a, b: a + b
print(add(3, 7))
full_name = lambda first, last: first + ' ' + last
print(full_name('Ada', 'Lovelace'))
Вывод
10
Ada Lovelace

Лямбда-функции в sorted()

Чаще всего лямбда-функции используют как аргумент key в sorted(). Параметр key сообщает Python, что перед сравнением каждый элемент нужно преобразовать этой функцией.

Сортировка без учёта регистра с помощью лямбды
names = ['Charlie', 'alice', 'Bob']
# Default sort is case-sensitive (uppercase first)
print(sorted(names))
# Sort by lowercase version (case-insensitive)
print(sorted(names, key=lambda name: name.lower()))
Вывод
['Bob', 'Charlie', 'alice']
['alice', 'Bob', 'Charlie']

Лямбда lambda name: name.lower() велит sorted() сравнивать версии строк в нижнем регистре. Сами строки остаются прежними: лямбда влияет только на сравнение.

Лямбды особенно полезны для сортировки сложных данных, например списков кортежей или словарей:

Сортировка кортежей по второму элементу
students = [
('Alice', 88),
('Bob', 95),
('Charlie', 72),
('Diana', 91),
]
# Sort by grade (second element)
by_grade = sorted(students, key=lambda s: s[1])
for name, grade in by_grade:
print(name + ': ' + str(grade))
Вывод
Charlie: 72
Alice: 88
Diana: 91
Bob: 95
Сортировка словарей по полю
products = [
{'name': 'Laptop', 'price': 999},
{'name': 'Mouse', 'price': 25},
{'name': 'Keyboard', 'price': 75},
]
# Sort by price, cheapest first
by_price = sorted(products, key=lambda p: p['price'])
for item in by_price:
print(item['name'] + ': $' + str(item['price']))
Вывод
Mouse: $25
Keyboard: $75
Laptop: $999

Лямбда-функции в map() и filter()

map() применяет функцию к каждому элементу списка и возвращает преобразованные результаты. filter() оставляет только те элементы, для которых функция возвращает True. Обе принимают функцию первым аргументом, и это идеальное место для лямбды.

map() и filter() с лямбдами
numbers = [1, 2, 3, 4, 5]
# Double every number
doubled = list(map(lambda x: x * 2, numbers))
print(doubled)
# Keep only even numbers
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens)
Вывод
[2, 4, 6, 8, 10]
[2, 4]

Мы оборачиваем map() и filter() в list(), потому что они возвращают ленивые итераторы, а не списки. Вызов list() заставляет их выдать все результаты сразу.

А вот пример ближе к практике, в нём мы извлекаем и фильтруем данные:

map и filter на практике
prices = [10.50, 23.99, 5.00, 45.00, 12.75]
# Add 10% tax to each price
with_tax = list(map(lambda p: round(p * 1.1, 2), prices))
print(with_tax)
# Filter prices over $20
expensive = list(filter(lambda p: p > 20, prices))
print(expensive)
Вывод
[11.55, 26.39, 5.5, 49.5, 14.03]
[23.99, 45.0]
Лямбда с map/filter
doubled = list(map(
    lambda x: x * 2, numbers
))
evens = list(filter(
    lambda x: x % 2 == 0, numbers
))
Списковое включение (часто предпочтительнее)
doubled = [x * 2 for x in numbers]

evens = [x for x in numbers
         if x % 2 == 0]

lambda или def: когда что использовать

Лямбды соблазнительны: они кажутся изящными и компактными. Но у них есть реальные ограничения. Вот когда что использовать:

Используйте lambda, когда:

  • нужна крошечная функция для аргумента key=, map() или filter()
  • логика помещается в одно простое выражение
  • функция больше нигде не понадобится
  • Используйте `def`, когда:

  • логике нужно больше одного выражения
  • нужны инструкции if/else, циклы или обработка ошибок
  • нужно описательное имя, которое служит документацией
  • функция будет использоваться в нескольких местах
  • Простая и сложная логика сортировки
    # Lambda: fine for simple key functions
    words = ['banana', 'apple', 'cherry']
    print(sorted(words, key=lambda w: len(w)))
    # def: better when logic is complex
    def sort_key(word):
    '''Sort by length, then alphabetically.'''
    return (len(word), word)
    print(sorted(words, key=sort_key))
    Вывод
    ['apple', 'banana', 'cherry']
    ['apple', 'banana', 'cherry']

    Частые приёмы с лямбдами

    Вот несколько приёмов, которые встречаются в реальном коде на Python. Если вы научитесь их узнавать, вам будет проще читать чужой код и понимать, когда лямбда подходит для задачи.

    Приём: сортировка списка словарей
    # Pattern 1: Sort by dictionary key
    people = [{'name': 'Zara', 'age': 22}, {'name': 'Alex', 'age': 30}]
    by_name = sorted(people, key=lambda p: p['name'])
    for p in by_name:
    print(p['name'] + ': ' + str(p['age']))
    Вывод
    Alex: 30
    Zara: 22
    Приём: лямбда с условием
    # Pattern 2: Conditional expression in lambda
    classify = lambda x: 'even' if x % 2 == 0 else 'odd'
    print(classify(4))
    print(classify(7))
    Вывод
    even
    odd
    Приём: max/min с key
    # Pattern 3: Using max/min with a key
    words = ['python', 'is', 'awesome']
    longest = max(words, key=lambda w: len(w))
    print(longest)
    shortest = min(words, key=lambda w: len(w))
    print(shortest)
    Вывод
    awesome
    is

    Практические упражнения

    Предскажите вывод лямбды
    Угадайте вывод

    Что выведет этот код? Впишите вывод в точности.

    operation = lambda a, b: a * b + 1
    print(operation(3, 4))
    print(operation(0, 10))
    operation = lambda a, b: a * b + 1
    print(operation(3, 4))
    print(operation(0, 10))
    Сортировка по последнему символу
    Напишите код

    Дан список слов. С помощью sorted() и лямбды отсортируйте их по последнему символу. Выведите получившийся отсортированный список.

    Используйте этот список: words = ['hello', 'world', 'python', 'code']

    Ожидаемый вывод: ['world', 'code', 'python', 'hello']

    words = ['hello', 'world', 'python', 'code']
    # Sort by last character and print
    Фильтрация и преобразование
    Напишите код

    Дан список чисел. С помощью filter() и лямбды оставьте только числа больше 10, затем с помощью map() и лямбды возведите каждое оставшееся число в квадрат. Выведите итоговый список.

    Используйте этот список: numbers = [3, 15, 7, 20, 8, 12]

    Ожидаемый вывод: [225, 400, 144]

    numbers = [3, 15, 7, 20, 8, 12]
    # Filter numbers > 10, then square them
    Сортировка учеников по среднему баллу
    Напишите код

    Дан список кортежей (name, gpa) с данными учеников. Отсортируйте их по среднему баллу (GPA) от самого высокого к самому низкому с помощью sorted() и лямбды. Выведите каждого ученика на отдельной строке в формате name: gpa.

    Используйте этот список:

    students = [('Alice', 3.5), ('Bob', 3.9), ('Charlie', 3.2), ('Diana', 3.7)]

    Ожидаемый вывод:

    Bob: 3.9
    Diana: 3.7
    Alice: 3.5
    Charlie: 3.2
    students = [('Alice', 3.5), ('Bob', 3.9), ('Charlie', 3.2), ('Diana', 3.7)]
    # Sort by GPA (highest first) and print
    Сортировка слов по длине
    Напишите код

    Дан список слов. С помощью sorted() и лямбды отсортируйте их по длине (сначала самые короткие). Если у двух слов одинаковая длина, они должны идти в алфавитном порядке. Выведите отсортированный список.

    Используйте этот список: words = ['fig', 'apple', 'date', 'kiwi', 'banana', 'pear', 'plum']

    Ожидаемый вывод: ['fig', 'date', 'kiwi', 'pear', 'plum', 'apple', 'banana']

    words = ['fig', 'apple', 'date', 'kiwi', 'banana', 'pear', 'plum']
    # Sort by length, then alphabetically

    Похожие уроки

    Урок был полезен?