popov . dev

Main

Library

Articles

Лямбда функции в...

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

Имя - это условное обозначение, которое используется для определения любого объекта или обращения к нему. Почти все, что нас окружает, имеет название. Мир программирования также придерживается этого принципа. Но обязательно ли давать названия всему? Или у вас может быть что-то просто безымянное (анонимное)? Ответ - да. Python предоставляет лямбда-функции, также известные как анонимные функции, которые на самом деле являются функциями не имеющими названия. Итак, давайте продолжим знакомство с этими "анонимными тайнами" Python в следующей последовательности:

  1. Зачем нужны лямбда-функции Python?
  2. Что такое лямбда-функции Python?
  3. Как написать лямбда-функцию?
  4. Как анонимные функции уменьшают размер кода?
  5. Лямбда-функции Python внутри других функций
  6. Как использовать анонимные функции с filter(), map(), reduce()

Зачем нужны лямбда-функции Python?

Основное назначение анонимных функций становится очевидным, когда вам нужна какая-то функция только один раз. Их можно создавать везде, где они необходимы. По этой причине лямбда-функции Python также известны как одноразовые функции, которые используются вместе с другими предопределенными функциями, такими как filter(), map() и т.д. Эти функции помогают сократить количество строк вашего кода по сравнению с обычными функциями python.

Что такое лямбда-функции Python?

Как мы и определили выше, лямбда-функции - это анонимные функции, не имеющие названия. Слово "lambda" - это не название, а ключевое слово, использующиеся для объявления функции.

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

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

lambda аргументы: выражение

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

lambda: выражение # Формат без аргументов
lambda параметр_один, параметр_два: выражение # Два аргумента

Приведем пару примеров реализации. Допустим функция возведения в квадрат:

a = lambda x: x**x
print(a(3)) # Вывод: 9

Или нам необходимо получить произведение двух чисел:

a = lambda x, y: x*y 
print(a(3, 7)) # Вывод: 21

Как вы можете видеть, мы привели здесь два примера. В первом примере используется лямбда-функция только с одним выражением, тогда как во втором примере ей передаются два аргумента. Также, обратите внимание, что обе функции имеют одно выражение, за которым следуют аргументы. Поэтому лямбда-функции нельзя использовать там, где вам нужны многострочные выражения.

Как анонимные функции уменьшают размер кода?

Прежде чем сравнивать объем кода, давайте сначала запишем синтаксис обычных функций и сравним его с синтаксисом лямбда-функций, описанным ранее. Как вы уже вероятно знаете обычные функции создаются с помощью ключевого слово def (есть материал посвященный функциям на нашем сайте). Напишем функцию возведения в квадрат из первого примера с использованием ключевого слова def.

def my_func(x): 
    return x*x 

print(my_func(3)) # Вывод: 9

Как вы можете видеть, в приведенном выше примере нам нужен оператор return в my_func для возведения в квадрат. Лямбда-функция наоборот, не использует оператор return, но тело анонимной функции записывается в той же строке, что и сама функция, после символа двоеточия. Поэтому размер функции меньше, чем у my_func.

Однако лямбда-функции в приведенных выше примерах вызываются с использованием другой переменной a. Это сделано потому, что эти функции не имеют имен и, следовательно, требуют идентификатора для вызова. Но этот факт может показаться непонятным, зачем использовать анонимные функции, когда для их вызова нужно присвоить имя? И, конечно, после присвоения функции идентификатора a она больше не будет безымянной! Верно?

Это логичный вопрос, но суть в том, что это неправильный способ использования этих анонимных функций, мы продемонстрировали их только для понимания принципа работы. Анонимные функции лучше всего использовать в составе других функций, которые либо используют некоторую функцию в качестве аргумента, либо возвращают функцию в качестве выходных данных. Чтобы наглядно показать это, давайте перейдем к нашей следующей теме.

Лямбда-функции Python внутри других функций

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

В следующем примере, мы напишем функцию new_func, которая является обычной функцией python, принимающая один аргумент x. Затем этот аргумент добавляется к параметру y, который передается через лямбда-функцию.

def new_func(x):
    return(lambda y: x+y)

t = new_func(3)
u = new_func(2)
print(t(3)) # Вывод: 6
print(u(3)) # Вывод: 5

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

Теперь, когда вы узнали, как использовать анонимные функции в собственных функциях, давайте перейдем к пониманию одного из наиболее популярных способов их использования, который используется в методах filter(), map() и reduce().

Как использовать анонимные функции в filter(), map() и reduce()

Метод filter() используется для фильтрации заданных итераций (списков, множеств и т.д.) с помощью другой функции, передаваемой в качестве аргумента, для проверки всех элементов на True или False. Имеет следующий синтаксис:

filter(функция, объект)

Теперь рассмотрим следующий пример:

my_list = [2, 3, 4, 5, 6, 7, 8]
new_list = list(filter(lambda a: (a / 3 == 2), my_list))
print(new_list) # Вывод: [6]

Здесь my_list - это список повторяющихся значений, который передается в функцию filter(). Эта функция использует лямбда-функцию для проверки того, есть ли в списке какие-либо значения, которые при делении на 3 будут равны 2. Возвращается значение в списка, который удовлетворяет выражению, присутствующему в анонимной функции.

Функция map() в Python - метод, который применяет заданную функцию ко всем итерациям и возвращает новый список. Имеет следующий синтаксис:

map(функция, объект)

Рассмотрим пример, демонстрирующий использование лямбда-функций в функции map():

my_list = [2, 3, 4, 5, 6, 7, 8]
new_list = list(map(lambda a: (a / 3 != 2), my_list))
print(new_list) # Вывод: [True, True, True, True, False, True, True]

Приведенный выше вывод показывает, что всякий раз, когда значение объекта my_list не равно 2 при делении на 3, возвращаемый результат должен быть равен True. Следовательно, для всех элементов в my_list возвращается значение True, за исключением значения 6, когда условие изменяется на False.

Функция reduce() используется для применения какой-либо другой функции к списку элементов, которые передаются ей в качестве параметра, и в конечном итоге возвращает одно значение. Имеет следующий синтаксис:

reduce(функция, последовательность)

Пример

from functools import reduce 
reduce(lambda a, b: a + b, [23, 21, 45, 98]) # Вывод: 187

Приведенный выше пример показан на следующем рисунке:

Вывод показывает, что все элементы списка постоянно добавляются для получения конечного результата.

Применений у лямбда функций достаточно много, в процессе разработки приложений вы сами определите необходимость их использования. Особенно, если будете руководствоваться рекомендациями, полученными в данной статье.

Comments

In order to leave your opinion, you need to register on the website