Что такое лямбда-функции в Python и как их использовать
Функция без имени, но с большим потенциалом применения.
Иллюстрация: Оля Ежак для Skillbox Media
В Python есть удобный инструмент для выполнения небольших задач — лямбда-функции. Их записывают всего в одну строку, не дают им имён и часто используют в качестве составляющих других функций, больших и серьёзных. В этой статье рассказываем, что такое лямбда-функции, как ими пользоваться и какие у них есть ограничения.
Содержание
- Что такое лямбда-функции и для чего они нужны
- Синтаксис лямбда-функций
- Ограничения
- Лямбда-функции в качестве аргументов других функций
- Как использовать if, else и elif в лямбда-функциях
- Когда стоит использовать лямбда-функции
Что такое лямбда-функции и для чего они нужны
Лямбда-функции — анонимные (безымянные) функции, которые можно создать на лету с помощью ключевого слова lambda. Их можно объявлять в любом месте программы без явного объявления с помощью ключевого слова def.
Главное преимущество лямбда-функций в том, что они компактнее обычных, ограничены одним выражением и не требуют придумывать им имена. А их цель — сделать код понятнее и предотвратить сложную и запутанную логику.
Читайте также:
Синтаксис лямбда-функций
Лямбда-функцию в Python можно объявить с помощью ключевого слова lambda. После него следует указать аргументы и выражение, результат которого вернётся. В общем виде синтаксис выглядит так:
Изначально лямбда-функции создавали как анонимные, чтобы их можно было использовать внутри других функций, поэтому у них нет имени. Но иногда удобно возвращаться к уже существующей «лямбде», а не писать её каждый раз снова. В таких случаях можно присвоить её переменной:
Ниже код простой лямбда-функции с несколькими аргументами:
Ограничения
У лямбда-функций есть ряд ограничений, которые мешают использовать их всегда:
- Можно использовать только выражения, поэтому практически все многострочные операторы и управляющие конструкции не будут работать. К ним относятся if (в виде блока), while, try, break, continue, except, finally, return и другие. Например, код ниже выдаст ошибку:
- В теле «лямбды» нельзя присваивать значения переменным:
- Нельзя импортировать модули:
- Допустимы только однострочные выражения:
- Лямбда-функции не могут быть генераторами, поэтому оператор yield использовать нельзя:
В лямбда-функциях также нежелательно использовать функции с побочным эффектом: запись в файл, чтение файла, отправка или приём данных по сети и вывод в консоль. Ошибки не будет, на это плохая практика.
Лямбда-функции в качестве аргументов других функций
Ещё одна суперспособность лямбда-функций в том, что их можно использовать в качестве аргументов полноценных функций. Например, когда нужно указать логику обработки данных до того, как переходить к самой обработке. Рассмотрим популярные способы использования лямбда-функций в качестве аргументов.
В функции filter()
filter() — функция для сортировки данных в Python. С помощью «лямбды» можно сразу задать условие сортировки. В примере ниже мы оставляем в списке слова, которые состоят из более чем трёх букв:
В функции map()
map() — функция-итератор, которая принимает на вход набор значений и изменяет их согласно заданному условию. Например, если есть список имён, то с помощью лямбда-функции можно добавить к ним приветствие:
В функции reduce()
reduce() — функция из модуля functools, которая последовательно применяет заданную функцию к элементам итерируемого объекта. Например, можно перемножить друг на друга все числа в списке:
Как использовать if, else и elif в лямбда-функциях
Лямбда-функции в Python ограничены одним выражением, поэтому в них можно использовать только тернарный условный оператор if-else. В общем виде его синтаксис выглядит так:
В нём:
- условие — логическое выражение, которое возвращает True или False;
- выражение1 — результат, если условие истинно (True);
- выражение2 — результат, если условие ложно (False).
Например, преобразуем список, оставив в нём только положительные числа, а отрицательные заменим на их модули. Проверку чисел реализуем с помощью тернарного условного оператора:
В Python нет тернарного варианта для условного оператора elif, но если очень хочется, то никто не запрещает вложить друг в друга несколько тернарных if-else. Это будет выглядеть так:
Мы использовали всего два условия, и конструкция уже стала слишком сложной для быстрого понимания. Лучше воздержаться от такого приёма и заменить вложенные тернарные if-else на многострочную запись if-elif-else. Но стоит помнить, что её не получится упаковать в «лямбду».
Когда стоит использовать лямбда-функции
Мы составили таблицу, с помощью которой можно быстро определить, какую функцию стоит использовать для решения задачи: классическую с ключевым словом def или однострочную лямбда-функцию.
Ситуация | Что использовать |
---|---|
Простая операция, например вычисление квадрата числа | lambda |
Функция пригодится всего один раз | lambda |
Сложная логика или многократное использование функции в коде проекта | def |
Нужны циклы, обработка ошибок и вывод данных в консоль | def |
Что запомнить
- Лямбда-функция — анонимная функция, которую можно создать на лету с помощью ключевого слова lambda. Её используют для реализации простых операций.
- В них может быть много аргументов и всего одно выражение, результат которого возвращается автоматически.
- В «лямбдах» нельзя использовать многострочные блоки. Если нужны условные операторы, то можно применить тернарный оператор if-else.
- Анонимные функции удобно использовать в качестве аргументов других функций, например map(), filter(), reduce() и других.
Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!