Код
#статьи

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

Функция без имени, но с большим потенциалом применения.

Иллюстрация: Оля Ежак для Skillbox Media

В Python есть удобный инструмент для выполнения небольших задач — лямбда-функции. Их записывают всего в одну строку, не дают им имён и часто используют в качестве составляющих других функций, больших и серьёзных. В этой статье рассказываем, что такое лямбда-функции, как ими пользоваться и какие у них есть ограничения.

Содержание


Что такое лямбда-функции и для чего они нужны

Лямбда-функции — анонимные (безымянные) функции, которые можно создать на лету с помощью ключевого слова 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() и других.

Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!

Изучайте IT на практике — бесплатно

Курсы за 2990 0 р.

Я не знаю, с чего начать
Жизнь можно сделать лучше!
Освойте востребованную профессию, зарабатывайте больше и получайте от работы удовольствие.
Каталог возможностей
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована