Lambda python что это
Перейти к содержимому

Lambda python что это

  • автор:

Лямбда-функция в Python простыми словами

В этой статье вы подробнее изучите анонимные функции, так же называемые «лямбда-функции». Давайте разберемся, что это такое, каков их синтаксис и как их использовать ( с примерами).

Лямбда-функции в Python являются анонимными. Это означает, что функция безымянна. Как известно, ключевое слов def используется в Python для определения обычной функции. В свою очередь, ключевое слово lambda используется для определения анонимной функции.

Лямбда-функция имеет следующий синтаксис.

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

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

1.1. Пример лямбда-функции.

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

double = lambda x: x*2 print(double(5))

Вывод:

В вышеуказанном коде lambda x: x*2 — это лямбда-функция. Здесь x — это аргумент, а x*2 — это выражение, которое вычисляется и возвращается.

Эта функция безымянная. Она возвращает функциональный объект с идентификатором double . Сейчас мы можем считать её обычной функцией.

double = lambda x: x*2
def double(x): return x * 2
  • Эта функция может иметь любое количество аргументов, но вычисляет и возвращает только одно значение
  • Лямбда-функции применимы везде, где требуются объекты-функции
  • Вы должны помнить, что синтаксически лямбда-функция ограничена, позволяет представить всего одно выражение
  • Они имеют множество вариантов применения в конкретных областях программирования, наряду с другими типами выражений, используемых в функциях.

2. Различие между обычной функцией и лямбда-функцией

Рассмотрим пример и попробуем понять различие между определением ( Def ) для обычной функции и lambda функции. Этот код возвращает заданное значение, возведенное в куб:

def defined_cube(y): return y*y*y lambda_cube = lambda y: y*y*y print(defined_cube(2)) print(lambda_cube(2))

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

Разберем вышеуказанный пример подробнее:

  • Без использования лямбды: Здесь обе функции возвращают заданное значение, возведенное в куб. Но при использовании def , нам пришлось определить функцию с именем и defined_cube() дать ей входную величину. После выполнения нам также понадобилось возвратить результат, из того места, откуда была вызвана функция, и мы сделали это, используя ключевое слово return .
  • С применением лямбды: Определение лямбды не включает оператор return , а всегда содержит возвращенное выражение. Мы также можем поместить определение лямбды в любое место, где ожидается функция, и нам не нужно присваивать его переменной. Так выглядят простые лямбда-функции.

3. Лямбда-функции и функции высшего порядка

Мы используем лямбда-функцию, когда нам ненадолго требуется безымянная функция.

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

Давайте рассмотрим еще несколько распространенных вариантов использования лямбда-функций.

3.1. Пример с filter()

Функция filter() в Python принимает в качестве аргументов функцию и список .

Функция вызывается со всеми элементами в списке, и в результате возвращается новый список, содержащий элементы, для которых функция результирует в True .

Вот пример использования функции filter() для отбора четных чисел из списка.

my_list = [1, 3, 4, 6, 10, 11, 15, 12, 14] new_list = list(filter(lambda x: (x%2 == 0) , my_list)) print(new_list)

Вывод:

[4, 6, 10, 12, 14]

3.2. Пример с map()

Функция map() принимает в качестве аргументов функцию и список.

Функция вызывается со всеми элементами в списке, и в результате возвращается новый список, содержащий элементы, возвращенные данной функцией для каждого исходного элемента.

Ниже пример использования функции map() для удвоения всех элементов списка.

current_list = [1, 3, 4, 6, 10, 11, 15, 12, 14] new_list = list(map(lambda x: x*2 , current_list)) print(new_list)

Вывод:

[2, 6, 8, 12, 20, 22, 30, 24, 28]

3.3. Пример с reduce()

Функция reduce() принимает в качестве аргументов функцию и список. Функция вызывается с помощью лямбда-функции и итерируемого объекта и возвращается новый уменьшенный результат. Так выполняется повторяющаяся операцию над парами итерируемых объектов. Функция reduce() входит в состав модуля functools .

from functools import reduce current_list = [5, 15, 20, 30, 50, 55, 75, 60, 70] summa = reduce((lambda x, y: x + y), current_list) print(summa)

Вывод:

Здесь результаты предыдущих двух элементов суммируются со следующим элементом, и это продолжается до конца списка, вот так:

5+15+20+30+50+55+75+60+70

4. Лямбда и списковое включение

В этом примере мы будем использовать лямбда-функцию со списковым включением и лямбда-функцию с циклом for . Мы выведем на экран таблицу из 10 элементов.

tables = [lambda x = x: x*10 for x in range(1, 11)] for table in tables: print(table())

Вывод:

10 20 30 40 50 60 70 80 90 100

5. Лямбда и условные операторы

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

Например, есть две цифры, и вы должны определить, какая из них представляет наибольшее число.

max_number = lambda a, b: a if a > b else b print(max_number(3, 5))

Вывод:

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

6. Лямбда и множественные операторы

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

current_list = [[10,6,9],[0, 14, 16, 80],[8, 12, 30, 44]] sorted_list = lambda x: (sorted(i) for i in x) second_largest = lambda x, func: [y[len(y)-2] for y in func(x)] result = second_largest(current_list, sorted_list) print(result)

Вывод:

[9, 16, 30]

В предыдущем примере, мы создали лямбда-функцию, которая сортирует каждый вложенный список в заданном списке. Затем этот список проходит как параметр для второй лямбда-функции, которая возвращает элемент n-2 из отсортированного списка, где n — длина вложенного списка.

Заключение

Теперь вы знаете как использовать в Python lambda -функции и можете:

  • Писать и использовать лямбда-функции.
  • Рационально выбирать между обычными и лямбда-функциями в Python.
  • Использовать лямбды с функциями высшего порядка или ключевыми функциями.
  • Использовать лямбды с абстракциями списков.
  • Добавлять условия к лямбда-функциям.
  • python
  • лямбда-выражения
  • списки
  • математические операции

Все, что нужно знать о lambda-функциях в Python

В этой статье вы узнаете о том, что такое лямбда-функции в Python. На самом деле, если вы знаете, что такое функции и умеете с ними работать, то знаете и что такое лямбда.

Лямбда-функция в Python — это просто функция Python. Но это некий особенный тип с ограниченными возможностями. Если есть желание погрузиться глубже и узнать больше, то эта статья целиком посвящена lambda .

Что такое лямбда в Python?

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

Для этого потребуется немного поменять направление мышление. Как вы знаете, все в Python является объектом.

Например, когда мы запускаем эту простейшую строку кода

x = 5 

Создается объект Python типа int , который сохраняет значение 5. x же является символом, который ссылается на объект.

Теперь проверим тип x и адрес, на которой он ссылается. Это можно сделать с помощью встроенных функций type и id .

>>> type(x) class 'int'> >>> id(x) 4308964832 

В итоге x ссылается на объект типа int , а расположен он по адресу, который вернула функция id .

Просто и понятно.

А что происходит при определении вот такой функции:

>>> def f(x): ... return x * x ... 

Повторим упражнение и узнаем type и id объекта f .

>>> def f(x): ... return x * x ... >>> type(f) class 'function'> >>> id(f) 4316798080 

Оказывается, в Python есть класс function , а только что определенная функция f — это его экземпляр. Так же как x был экземпляром класса integer . Другими словами, о функциях можно думать как о переменных. Разница лишь в том, что переменные хранят данные, а функции — код.

Это же значит, что функции можно передать в качестве аргументов другим функциям или даже использовать их как тип возвращаемого значения.

Рассмотрим простой пример, где функция f передается другой функции.

def f(x): return x * x def modify_list(L, fn): for idx, v in enumerate(L): L[idx] = fn(v) L = [1, 3, 2] modify_list(L, f) print(L) #вывод: [1, 9, 4] 

Попробуйте разобраться самостоятельно с тем, что делает этот код, прежде чем читать дальше.

Итак, modify_list — это функция, которая принимает список L и функцию fn в качестве аргументов. Затем она перебирает список элемент за элементом и применяет функцию к каждому из них.

Это общий способ изменения объектов списка, ведь он позволяет передать функцию, которая займется преобразованием. Так, если передать modify_list функцию f , то результатом станет список, где все значения будут возведены в квадрат.

Но можно передать и любую другую, которая изменит оригинальный список другим способом. Это очень мощный инструмент.

Теперь, когда с основами разобрались, стоит перейти к лямбда. Лямбда в Python — это просто еще один способ определения функции. Вот базовый синтаксис лямбда-функции в Python:

lambda arguments: expression 

Лямбда принимает любое количество аргументов (или ни одного), но состоит из одного выражения. Возвращаемое значение — значение, которому присвоена функция. Например, если нужно определить функцию f из примера выше, то это можно сделать вот так:

>>> f = lambda x: x * x >>> type(f) class 'function'> 

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

Лямбда с несколькими аргументами

Определить лямбда-функцию с одним аргументом не составляет труда.

>>> f = lambda x: x * x >>> f(5) 25 

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

>>> f = lambda x, y: x * y >>> f(5, 2) 10 

Отлично! А как насчет лямбда-функции без аргументов?

Лямбда-функция без аргументов

Допустим, нужно создать функцию без аргументов, которая бы возвращала True . Этого можно добиться с помощью следующего кода.

>>> f = lambda: True >>> f() True 

Несколько лямбда-функций

В определенный момент возникнет вопрос: а можно ли иметь лямбда-функцию из нескольких строк.

Ответ однозначен: нет.

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

Примеры лямбда-функций

Теперь рассмотрим самые распространенные примеры использования лямбда-функций.

Лямбда-функция и map

Распространенная операция со списками в Python — применение операции к каждому элементу.

map() — это встроенная функция Python, принимающая в качестве аргумента функцию и последовательность. Она работает так, что применяет переданную функцию к каждому элементу.

Предположим, есть список целых чисел, которые нужно возвести в квадрат с помощью map .

>>> L = [1, 2, 3, 4] >>> list(map(lambda x: x**2, L)) [1, 4, 9, 16] 

Обратите внимание на то, что в Python3 функция map возвращает объект Map , а в Python2 — список.

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

Вот еще один пример.

Лямбда-функция и filter

filter() — это еще одна встроенная функция, которая фильтрует последовательность итерируемого объекта.

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

Если возвращаемое значение — True , элемент остается. В противном случае — отклоняется. Определим, например, простую функцию, которая возвращает True для четных чисел и False — для нечетных:

def even_fn(x): if x % 2 == 0: return True return False print(list(filter(even_fn, [1, 3, 2, 5, 20, 21]))) #вывод: [2, 20] 

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

print(list(filter(lambda x: x % 2 == 0, [1, 3, 2, 5, 20, 21]))) 

И в этом сила лямбда-функций.

Лямбда-функция и сортировка списков

Сортировка списка — базовая операция в Python. Если речь идет о списке чисел или строк, то процесс максимально простой. Подойдут встроенные функции sort и sorted .

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

Функция применяется ко всем элементам объекта, а возвращаемое значение — то, на основе чего выполнится сортировка. Рассмотрим пример. Есть класс Employee .

class Employee: def __init__(self, name, age): self.name = name self.age = age 

Теперь создадим экземпляры этого класса и добавим их в список.

Alex = Employee('Alex', 20) Amanda = Employee('Amanda', 30) David = Employee('David', 15) L = [Alex, Amanda, David] 

Предположим, что мы хотим отсортировать его на основе поля age сотрудников. Вот что нужно сделать для этого:

L.sort(key=lambda x: x.age) print([item.name for item in L]) # вывод: ['David', 'Alex', 'Amanda'] 

Лямбда-выражение было использовано в качестве параметра key вместо отдельного ее определения и затем передачи в функцию sort .

Пара слов о выражениях и инструкциях

Как уже упоминалось, лямбда могут иметь только одно выражение (expression) в теле.

Обратите внимание, что речь идет не об инструкции (statement).

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

Например, инструкция if или циклы for и while являются примерами инструкций. Заменить инструкцию на значение попросту невозможно.

А вот выражения — это значения. Запросто можно заменить все выражения в программе на значения, и программа продолжит работать корректно.

  • 3 + 5 — выражение со значением 8
  • 10 > 5 — выражение со значением True
  • True and (5 < 3) — выражение со значением False

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

Lambda python что это

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

lambda [параметры] : инструкция

Определим простейшее лямбда-выражение:

message = lambda: print("hello") message() # hello

Здесь лямбда-выражение присваивается переменной message. Это лямбда-выражение не имеет параметров, ничего не возвращает и просто выводит строку «hello» на консоль. И через переменную message мы можем вызвать это лямбда-выражение как обычную функцию. Фактически оно аналогично следующей функции:

def message(): print("hello")

Если лямбда-выражение имеет параметры, то они определяются после ключевого слова lambda . Если лямбда-выражение возвращает какой-то результат, то он указывается после двоеточия. Например, определим лямбда-выражение, которое возвращает квадрат числа:

square = lambda n: n * n print(square(4)) # 16 print(square(5)) # 25

В данном случае лямбда-выражение принимает один параметр — n. Справа от двоеточия идет возвращаемое значение — n* n . Это лямбда-выражение аналогично следующей функции:

def square2(n): return n * n

Аналогичным образом можно создавать лямбда-выражения, которые принимают несколько параметров:

sum = lambda a, b: a + b print(sum(4, 5)) # 9 print(sum(5, 6)) # 11

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

def do_operation(a, b, operation): result = operation(a, b) print(f"result = ") do_operation(5, 4, lambda a, b: a + b) # result = 9 do_operation(5, 4, lambda a, b: a * b) # result = 20

В данном случае нам нет необходимости определять функции, чтобы передать их в качестве параметра, как в прошлой статье.

То же самое касается и возвращение лямбда-выражений из функций:

def select_operation(choice): if choice == 1: return lambda a, b: a + b elif choice == 2: return lambda a, b: a - b else: return lambda a, b: a * b operation = select_operation(1) # operation = sum print(operation(10, 6)) # 16 operation = select_operation(2) # operation = subtract print(operation(10, 6)) # 4 operation = select_operation(3) # operation = multiply print(operation(10, 6)) # 60

Анонимная функция (лямбда-выражение)#

В Python лямбда-выражение позволяет создавать анонимные функции — функции, которые не привязаны к имени.

В анонимной функции:

  • может содержаться только одно выражение
  • могут передаваться сколько угодно аргументов
In [1]: def sum_arg(a, b): return a + b In [2]: sum_arg(1, 2) Out[2]: 3 

Аналогичная анонимная функция, или лямбда-функция:

In [3]: sum_arg = lambda a, b: a + b In [4]: sum_arg(1, 2) Out[4]: 3 

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

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

Например, в функции sorted лямбда-выражение можно использовать для указания ключа для сортировки:

In [5]: list_of_tuples = [('IT_VLAN', 320), . : ('Mngmt_VLAN', 99), . : ('User_VLAN', 1010), . : ('DB_VLAN', 11)] In [6]: sorted(list_of_tuples, key=lambda x: x[1]) Out[6]: [('DB_VLAN', 11), ('Mngmt_VLAN', 99), ('IT_VLAN', 320), ('User_VLAN', 1010)] 

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *