Что такое лямбда-функции в Python и как их использовать
Функция без имени, но с большим потенциалом применения.
 
 
В Python есть удобный инструмент для выполнения небольших задач — лямбда-функции. Их записывают всего в одну строку, не дают им имён и часто используют в качестве составляющих других функций, больших и серьёзных. В этой статье рассказываем, что такое лямбда-функции, как ими пользоваться и какие у них есть ограничения.
Содержание
- Что такое лямбда-функции и для чего они нужны
- Синтаксис лямбда-функций
- Ограничения
- Лямбда-функции в качестве аргументов других функций
- Как использовать if, else и elif в лямбда-функциях
- Когда стоит использовать лямбда-функции
Что такое лямбда-функции и для чего они нужны
Лямбда-функции — анонимные (безымянные) функции, которые можно создать на лету с помощью ключевого слова lambda. Их можно объявлять в любом месте программы без явного объявления с помощью ключевого слова def.
Главное преимущество лямбда-функций в том, что они компактнее обычных, ограничены одним выражением и не требуют придумывать им имена. А их цель — сделать код понятнее и предотвратить появление сложной и запутанной логики.

Читайте также:
Синтаксис лямбда-функций
Лямбда-функцию в Python можно объявить с помощью ключевого слова lambda. После него следует указать аргументы и выражение, результат которого вернётся. В общем виде синтаксис выглядит так:
lambda аргументы: выражениеИзначально лямбда-функции создавали как анонимные, чтобы их можно было использовать внутри других функций, поэтому у них нет имени. Но иногда удобно возвращаться к уже существующей «лямбде», а не писать её каждый раз снова. В таких случаях можно присвоить её переменной:
имя_переменной = lambda аргументы: выражениеНиже код простой лямбда-функции с несколькими аргументами:
# Лямбда-функция для вычисления среднего арифметического трёх чисел
average = lambda x, y, z: (x + y + z) / 3
print(average(3, 6, 9))  # 6.0Ограничения
У лямбда-функций есть ряд ограничений, которые мешают использовать их всегда:
- Можно использовать только выражения, поэтому практически никакие многострочные операторы и управляющие конструкции не будут работать. К ним относятся if (в виде блока), while, try, break, continue, except, finally, return и другие. Например, код ниже выдаст ошибку:
invalid = lambda x: if x > 0: 15 else -x  # SyntaxError- В теле «лямбды» нельзя присваивать значения переменным:
invalid = lambda x: (y = x + 1)  # SyntaxError- Нельзя импортировать модули:
invalid = lambda: import math  # SyntaxError- Допустимы только однострочные выражения:
invalid = lambda x: (
    x + 1,
    x * 2
)  # SyntaxError- Лямбда-функции не могут быть генераторами, поэтому оператор yield использовать нельзя:
invalid = lambda: (yield 5)  # SyntaxErrorВ лямбда-функциях также нежелательно использовать функции с побочным эффектом: запись в файл, чтение файла, отправка или приём данных по сети и вывод в консоль. Ошибки не будет, на это плохая практика.
Лямбда-функции в качестве аргументов других функций
Ещё одна суперспособность лямбда-функций в том, что их можно использовать в качестве аргументов полноценных функций. Например, когда нужно указать логику обработки данных до того, как переходить к самой обработке. Рассмотрим популярные способы использования лямбда-функций в качестве аргументов.
В функции filter()
filter() — функция для сортировки данных в Python. С помощью «лямбды» можно сразу задать условие сортировки. В примере ниже мы оставляем в списке слова, которые состоят из более чем трёх букв:
words = ['яблоко', 'дом', 'небо', 'хор']
long_words = list(filter(lambda word: len(word) > 3, words))
print(long_words)  # ['яблоко', 'небо']В функции map()
map() — функция-итератор, которая принимает на вход набор значений и изменяет их согласно заданному условию. Например, если есть список имён, то с помощью лямбда-функции можно добавить к ним приветствие:
names = ['Алёна', 'Денис', 'Саша']
greetings = list(map(lambda name: f"Привет, {name}", names))
print(greetings)  # ['Привет, Алёна', 'Привет, Денис', 'Привет, Саша']В функции reduce()
reduce() — функция из модуля functools, которая последовательно применяет заданную функцию к элементам итерируемого объекта. Например, можно перемножить друг на друга все числа в списке:
from functools import reduce
numbers = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, numbers)
print(product)  # 1 * 2 * 3 * 4 = 24Как использовать if, else и elif в лямбда-функциях
Лямбда-функции в Python ограничены одним выражением, поэтому в них можно использовать только тернарный условный оператор if-else. В общем виде его синтаксис выглядит так:
выражение1 if условие else выражение2В нём:
- условие — логическое выражение, которое возвращает True или False;
- выражение1 — результат, если условие истинно (True);
- выражение2 — результат, если условие ложно (False).
Например, преобразуем список, оставив в нём только положительные числа, а отрицательные заменим на их модули. Проверку чисел реализуем с помощью тернарного условного оператора:
process_list = lambda lst: [x if x > 0 else -x for x in lst]
print(process_list([-10, 20, -30, 40]))  # [10, 20, 30, 40]В Python нет тернарного варианта для условного оператора elif, но если очень хочется, то никто не запрещает вложить друг в друга несколько тернарных if-else. Это будет выглядеть так:
выражение1 if условие1 else выражение2 if условие2 else выражение3Мы использовали всего два условия, и конструкция уже стала слишком сложной для быстрого понимания. Лучше воздержаться от такого приёма и заменить вложенные тернарные if-else на многострочную запись if-elif-else. Но стоит помнить, что её не получится упаковать в «лямбду».
Когда стоит использовать лямбда-функции
Мы составили таблицу, с помощью которой можно быстро определить, какую функцию стоит использовать для решения задачи: классическую с ключевым словом def или однострочную лямбда-функцию.
| Ситуация | Что использовать | 
|---|---|
| Простая операция, например вычисление квадрата числа | lambda | 
| Функция пригодится всего один раз | lambda | 
| Сложная логика или многократное использование функции в коде проекта | def | 
| Нужны циклы, обработка ошибок и вывод данных в консоль | def | 
Что запомнить
- Лямбда-функция — анонимная функция, которую можно создать на лету с помощью ключевого слова lambda. Её используют для реализации простых операций.
- В них может быть много аргументов и всего одно выражение, результат которого возвращается автоматически.
- В «лямбдах» нельзя использовать многострочные блоки. Если нужны условные операторы, то можно применить тернарный оператор if-else.
- Анонимные функции удобно использовать в качестве аргументов других функций, например map(), filter(), reduce() и других.
Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!
 Все
                                Все
                             Истории
                                        Истории Дизайн
                                    Дизайн Код
                                    Код Геймдев
                                    Геймдев Бизнес
                                    Бизнес Маркетинг
                                    Маркетинг Управление
                                    Управление Кино
                                    Кино Музыка
                                    Музыка Проектная фотография
                                    Проектная фотография Развитие
                                    Развитие Здоровье
                                    Здоровье Деньги
                                    Деньги Образование
                                    Образование EdTech
                                    EdTech Корп. обучение
                                    Корп. обучение Блог Skillbox
                                    Блог Skillbox Глоссарий
                                        Глоссарий Спецпроекты
                                        Спецпроекты Профориентация
                                        Профориентация 
                                    
 
			 
                     
     
                                     
                                     
                                     
                                    