Функция без имени, но с большим потенциалом применения.
В Python есть удобный инструмент для выполнения небольших задач — лямбда-функции. Их записывают всего в одну строку, не дают им имён и часто используют в качестве составляющих других функций, больших и серьёзных. В этой статье рассказываем, что такое лямбда-функции, как ими пользоваться и какие у них есть ограничения.
Что такое лямбда-функции и для чего они нужны
Главное преимущество лямбда-функций в том, что они компактнее обычных, ограничены одним выражением и не требуют придумывать им имена. А их цель — сделать код понятнее и предотвратить сложную и запутанную логику.
Синтаксис лямбда-функций
Лямбда-функцию в 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() и других.