Лямбда-функция в Python простыми словами / Хабр
В этой статье вы подробнее изучите анонимные функции, так же называемые «лямбда-функции». Давайте разберемся, что это такое, каков их синтаксис и как их использовать ( с примерами).
Лямбда-функции в Python являются анонимными. Это означает, что функция безымянна. Как известно, ключевое слов def
используется в Python для определения обычной функции. В свою очередь, ключевое слово lambda
используется для определения анонимной функции.
Лямбда-функция имеет следующий синтаксис.
Lambda аргументы: выражение
Лямбда-функции могут иметь любое количество аргументов, но у каждой может быть только одно выражение. Выражение вычисляется и возвращается. Эти функции могут быть использованы везде, где требуется объект-функция.
1.1. Пример лямбда-функции.
Ниже представлен пример лямбда-функции, удваивающей вводимое значение.
double = lambda x: x*2 print(double(5))
Вывод:
10
В вышеуказанном коде 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))
Вывод:
8 8
Как показано в примере выше, обе представленные функции, defined_cube()
и lambda_cube()
, ведут себя одинаково, как и предполагалось.
Разберем вышеуказанный пример подробнее:
Без использования лямбды: Здесь обе функции возвращают заданное значение, возведенное в куб. Но при использовании
def
, нам пришлось определить функцию с именем иdefined_cube()
дать ей входную величину. После выполнения нам также понадобилось возвратить результат, из того места, откуда была вызвана функция, и мы сделали это, используя ключевое словоreturn
.С применением лямбды: Определение лямбды не включает оператор
return
, а всегда содержит возвращенное выражение.Мы также можем поместить определение лямбды в любое место, где ожидается функция, и нам не нужно присваивать его переменной. Так выглядят простые лямбда-функции.
3. Лямбда-функции и функции высшего порядка
Мы используем лямбда-функцию, когда нам ненадолго требуется безымянная функция.
В Python мы часто используем их как аргумент функции высшего порядка (функции, которая принимает другие функции в качестве аргументов). Лямбда-функции используют вместе с такими встроенными функциями как filter()
, map()
,reduce()
и др.
Давайте рассмотрим еще несколько распространенных вариантов использования лямбда-функций.
3.1. Пример с filter()
Функция filter()
в Python принимает в качестве аргументов функцию и список .
Функция вызывается со всеми элементами в списке, и в результате возвращается новый список, содержащий элементы, для которых функция результирует в
.
Вот пример использования функции 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)
Вывод:
380
Здесь результаты предыдущих двух элементов суммируются со следующим элементом, и это продолжается до конца списка, вот так:
5+15+20+30+50+55+75+60+70
4. Лямбда и списковое включение
В этом примере мы будем использовать лямбда-функцию со списковым включением и лямбда-функцию с циклом
. Мы выведем на экран таблицу из 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))
Вывод:
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.
Использовать лямбды с функциями высшего порядка или ключевыми функциями.
Использовать лямбды с абстракциями списков.
Добавлять условия к лямбда-функциям.
Датчик состава смеси UEGO X-Series (универсальный, широкополосный лямбда зонд) Bosch 4,9 LSU 30-0300, AEM
AEM UEGO X-Series : самый быстрый и точный лямбда зонд из существующих на данный момент.
Американский бренд AEM не нуждается в представлении. Он хорошо знаком всем, кто имеет отношение к автоспорту и тюнингу. AEM UEGO X-Series – это лучшая широкополосная лямбда с цифровым дисплеем на данный момент в линейке продукции AEM, и, пожалуй, лучшая в мире.
![](/800/600/http/naurok-test.nyc3.cdn.digitaloceanspaces.com/uploads/test/807503/44748/151381_1584269362.jpg)
![](/800/600/http/replicadisk.ru/wp-content/uploads/6/e/6/6e6955466c8f526b8c0716e3f9b95d3b.jpeg)
![](/800/600/http/prezentacii.org/upload/cloud/19/06/153236/images/screen34.jpg)
Определение лямбда
К
Гордон Скотт
Полная биография
Гордон Скотт был активным инвестором и техническим аналитиком более 20 лет. Он дипломированный специалист по рынку (CMT).
Узнайте о нашем редакционная политика
Обновлено 29 апреля 2022 г.
Факт проверен
Скайлар Кларин
Факт проверен Скайлар Клэрин
Полная биография
Скайлар Клэрин занимается проверкой фактов и экспертом в области личных финансов с обширным опытом, включая ветеринарные технологии и изучение фильмов.
Узнайте о нашем редакционная политика
Что такое лямбда?
В торговле опционами лямбда — это греческая буква, присвоенная переменной, которая говорит о коэффициенте кредитного плеча, предоставляемого опционом, при изменении цены этого опциона. Эта мера также называется коэффициентом заемных средств или, в некоторых странах, эффективным рычагом.
Ключевые выводы
- Значения лямбда определяют размер кредитного плеча, используемого опционом.
- Считается одним из «Малых греков» в финансовой литературе. Эту меру обычно находят, работая с дельтой.
- Показатель чувствителен к изменениям волатильности, но он не рассчитывается так же, как вега.
Понимание лямбды
Лямбда показывает, какой коэффициент кредитного плеча обеспечит опцион при изменении цены базового актива на 1%. Лямбда — это измерение, считающееся одним из «минорных греков», и оно широко не используется, потому что большую часть того, что оно определяет, можно обнаружить, используя комбинацию других вариантов греков. Тем не менее, информация, которую он предоставляет, полезна для понимания того, какое кредитное плечо использует трейдер в торговле опционами. Там, где кредитное плечо является ключевым фактором для конкретной сделки, лямбда становится полезной мерой.
Полное уравнение лямбда выглядит следующим образом:
λ «=» ∂ С / С ∂ С / С «=» С С ∂ С ∂ С «=» ∂ п С ∂ п С где: С «=» Цена опции С «=» Цена базовой ценной бумаги ∂ «=» Изменять \begin{align}&\lambda=\frac{\partial C/C}{\partial S/S}=\frac{S}{C}\frac{\partial C}{\partial S}=\frac{ \partial \text{ ln }C}{\partial \text{ ln }S}\\&\textbf{где:}\\&C=\text{Цена опциона}\\&S=\text{Цена базовая безопасность}\\&\partial=\text{Изменить}\end{выровнено} λ=∂S/S∂C/C=CS∂S∂C=∂ ln S∂ ln C, где:C=Цена опционаS=Цена базовой ценной бумаги∂=Изменение
Упрощенный расчет лямбды сводится к значению дельты, умноженному на отношение цены акции к цене опциона. Дельта является одним из стандартных греческих символов и представляет собой сумму, на которую ожидается изменение цены опциона, если цена базового актива изменится на один доллар.
Лямбда в действии
Предполагая, что доля акций торгуется по 100 долларов, а опцион колл «при деньгах» с ценой исполнения 100 долларов торгуется по 2,10 доллара, а также при условии, что дельта-оценка равна 0,58, значение лямбда можно рассчитать с помощью этого уравнения:
лямбда «=» 0,58 × ( 100 2.10 ) «=» 27,62 \text{Lambda}=0,58\times\left(\frac{100}{2,10}\right)=27,62 Лямбда = 0,58 × (2,10100) = 27,62
Это значение лямбда указывает на сравнимое кредитное плечо опциона по сравнению с акцией. Следовательно, увеличение стоимости акций на 1% приведет к увеличению той же стоимости опциона в долларах на 27,62%.
Подумайте, что происходит с долей в 1000 долларов в этой 100-долларовой акции. Трейдер владеет 10 акциями, и если акции в этом примере вырастут на 1% (со 100 до 101 доллара за акцию), стоимость доли трейдера увеличится на 10 долларов до 1010 долларов. Но если у трейдера была аналогичная доля в размере 1050 долларов в опционе (пять контрактов по 2,10 доллара), результирующее увеличение стоимости этой ставки будет совсем другим. Поскольку стоимость опциона увеличится с 2,10 до 2,68 доллара (на основе значения дельты), тогда стоимость 1050 долларов, удерживаемых в этих пяти опционных контрактах, вырастет до 1340 долларов, т. е. на 27,62%.
Лямбда и волатильность
В научных статьях в некоторых случаях лямбда и вега приравниваются. Путаница, созданная этим, предполагает, что расчеты их формул одинаковы, но это неверно. Однако, поскольку влияние подразумеваемой волатильности на цены опционов измеряется вега, и поскольку это влияние отражается в изменении значений дельты, лямбда и вега часто указывают на одинаковые или похожие результаты изменения цен.
Например, значение лямбда имеет тенденцию быть выше, чем дальше находится дата истечения срока действия опциона, и падает по мере приближения даты истечения срока действия. Это наблюдение верно и для веги. Лямбда изменяется, когда происходят большие колебания цены или повышенная волатильность базового актива, потому что это значение отражается в цене опционов. Если цена опциона движется вверх по мере роста волатильности, то его значение лямбда будет уменьшаться, потому что более высокая стоимость опционов означает уменьшение кредитного плеча.
Учебное пособие: лямбда-функции в Python
9 марта 2022 г.
В этом учебном пособии мы определим лямбда-функции в Python и рассмотрим преимущества и ограничения их использования.
Что такое лямбда-функция в Python?
Лямбда-функция — это анонимная функция (т. е. определенная без имени), которая может принимать любое количество аргументов, но, в отличие от обычных функций, оценивает и возвращает только одно выражение.
Лямбда-функция в Python имеет следующий синтаксис:
лямбда-параметры: выражение
Структура лямбда-функции включает три элемента:
- Ключевое слово
lambda
— аналогdef
в обычных функциях - Параметры — поддерживают передачу позиционных и ключевых аргументов
, как обычные функции - Тело — выражение для заданных параметров, оцениваемых
с помощью лямбда-функции
Обратите внимание, что, в отличие от обычной функции, мы не заключаем параметры лямбда-функции в круглые скобки. Если лямбда-функция принимает два или более параметра, мы перечисляем их через запятую.
Мы используем лямбда-функцию для оценки только одного короткого выражения (в идеале, однострочного) и только один раз, что означает, что мы не собираемся применять эту функцию позже. Обычно мы передаем лямбда-функцию в качестве аргумента функции более высокого порядка (той, которая принимает другие функции в качестве аргументов), такой как встроенные функции Python, такие как фильтр()
, карта()
или уменьшить()
.
Как работает лямбда-функция в Python
Давайте рассмотрим простой пример лямбда-функции:
лямбда х: х + 1
<функция __main__.<лямбда>(x)>
Приведенная выше лямбда-функция принимает один аргумент, увеличивает его на 1 и возвращает результат. Это более простая версия следующей нормальной функции с def
и , возвращающими
ключевых слов:
по определению increment_by_one(x): вернуть х + 1
Однако на данный момент наша лямбда-функция lambda x: x + 1
только создает объект функции и ничего не возвращает. Мы ожидали этого: мы не предоставили никакого значения (аргумента) его параметру
x
. Давайте сначала назначим переменную, передадим ее лямбда-функции и посмотрим, что мы получим на этот раз:
а = 2 печать (лямбда х: а + 1)
<функция <лямбда> по адресу 0x00000250CB0A5820>
Вместо возврата 3
, как можно было ожидать, наша лямбда-функция вернула сам объект функции и его расположение в памяти. Действительно, это неправильный способ вызова лямбда-функции. Чтобы передать аргумент лямбда-функции, выполнить ее и вернуть результат, мы должны использовать следующий синтаксис:
(лямбда х: х + 1)(2)
3
Обратите внимание: хотя параметр нашей лямбда-функции не заключен в круглые скобки, при его вызове мы добавляем круглые скобки вокруг всей конструкции лямбда-функции и вокруг переданного ей аргумента.
Еще одна вещь, на которую следует обратить внимание в приведенном выше коде, это то, что с лямбда-функцией мы можем выполнить функцию сразу после ее создания и получить результат. Это так называемая немедленно вызванная функция выполнения (или IIFE ).
Мы можем создать лямбда-функцию с несколькими параметрами. В этом случае мы разделяем параметры в определении функции запятой. Когда мы выполняем такую лямбда-функцию, мы перечисляем соответствующие аргументы в том же порядке и тоже разделяем их запятой:
(лямбда x, y, z: x + y + z)(3, 8, 1)
12
Также можно использовать лямбда-функцию для выполнения условных операций. Ниже приведен лямбда-аналог простой функции if-else :
print((лямбда x: x если(x > 10) else 10)(5))
print((лямбда x: x если(x > 10) else 10)(12))
10 12
Если присутствует несколько условий ( if-elif-…-else ), мы должны их вложить друг в друга:
(лямбда x: x * 10, если x > 10 иначе (x * 5, если x < 5, иначе x))(11)
110
Проблема с этим подходом в том, что уже с одним вложенным условием код становится трудным для чтения, как мы можем видеть выше. В таких ситуациях обычная функция с набором условий if-elif-…-else будет лучшим выбором, чем лямбда-функция. Действительно, мы можем написать лямбда-функцию из приведенного выше примера следующим образом:
определение check_conditions(x): если х > 10: вернуть х * 10 Элиф х < 5: вернуть х * 5 еще: вернуть х check_conditions(11)
110
Несмотря на то, что приведенная выше функция занимает больше строк, чем соответствующая лямбда-функция, ее намного легче читать.
Мы можем присвоить лямбда-функцию переменной, а затем вызвать эту переменную как обычную функцию:
приращение = лямбда х: х + 1 приращение(2)
3
Однако, согласно руководству по стилю PEP 8 для кода Python, это плохая практика:
Использование оператора присваивания устраняет единственное преимущество, которое лямбда-выражение может предложить по сравнению с явным оператором def (т.
е. его можно встроить в более крупное выражение).
Итак, если нам действительно нужно сохранить функцию для дальнейшего использования, вместо того, чтобы присваивать лямбда-функцию переменной, нам лучше определить эквивалентную обычную функцию.
Применение лямбда-функции в Python
Лямбда с фильтром
()
Функция Мы используем функцию filter()
в Python для выбора определенных элементов из
итерируемых (например, списков, наборов, кортежей, серий и т. д.) на основе предопределенных критериев
. Он принимает два аргумента:
- Функция, определяющая критерии фильтрации
- Итерируемый объект, на котором выполняется функция
В результате этой операции получаем объект фильтра:
лст = [33, 3, 22, 2, 11, 1] фильтр(лямбда х: х > 10, лст)
<фильтр по адресу 0x250cb090520>
Чтобы получить новый итерируемый объект из объекта фильтра со всеми элементами из исходного итерируемого объекта, которые удовлетворяют предопределенным критериям, нам нужно передать объект фильтра в соответствующую функцию стандартной библиотеки Python: list()
, tuple()
, set()
, frostset()
или sorted()
(чтобы вернуть отсортированный список).
Давайте отфильтруем список чисел, выбрав только числа больше 10, и вернем список, отсортированный в порядке возрастания:
лст = [33, 3, 22, 2, 11, 1] отсортировано (фильтр (лямбда x: x > 10, lst))
[11, 22, 33]
Нам не нужно создавать новый итерируемый объект того же типа, что и исходный. Также мы можем сохранить результат этой операции в переменной:
лст = [33, 3, 22, 2, 11, 1] tpl = кортеж (фильтр (лямбда x: x > 10, lst)) тпл
(33, 22, 11)
Лямбда с функцией
map()
Мы используем функцию map()
в Python для выполнения определенной операции над каждым элементом итерируемого объекта. Его синтаксис идентичен filter()
: функция для выполнения и итерация, к которой эта функция применяется. Функция map()
возвращает объект карты, из которого мы можем получить новую итерацию, передав этот объект соответствующей функции Python: список()
, кортеж()
, set()
, замороженный набор()
или sorted()
.
Как и в случае функции filter()
, мы можем извлечь итерацию другого типа, отличного от исходного, из объекта карты, а также присвоить ее переменной. Ниже приведен пример использования функции map()
для умножения каждого элемента в списке на 10 и вывода сопоставленных значений в виде кортежа, назначенного переменной tpl
:
лст = [1, 2, 3, 4, 5] печать (карта (лямбда x: x * 10, lst)) tpl = кортеж (карта (лямбда x: x * 10, lst)) тпл
<объект карты по адресу 0x00000250CB0D5F40> (10, 20, 30, 40, 50)
Одно важное различие между функциями map()
и filter()
заключается в том, что первая всегда возвращает итерацию той же длины, что и исходная . Итак, поскольку объекты серии pandas также являются итерируемыми, мы можем применить функцию map()
к столбцу DataFrame, чтобы создать новый столбец:
импортировать панд как pd df = pd.DataFrame({'col1': [1, 2, 3, 4, 5], 'col2': [0, 0, 0, 0, 0]}) печать (дф) df['col3'] = df['col1'].map(лямбда x: x * 10) дф
столбец 1 столбец 2 0 1 0 1 2 0 2 3 0 3 4 0 4 5 0 столбец1 столбец2 столбец3 0 1 0 10 1 2 0 20 2 3 0 30 3 4 0 40 4 5 0 50
Обратите внимание, что для получения того же результата в приведенном выше случае также можно использовать функцию apply()
:
df['col3'] = df['col1'].apply(лямбда x: x * 10) дф
столбец 1 столбец 2 столбец 3 0 1 0 10 1 2 0 20 2 3 0 30 3 4 0 40 4 5 0 50
Мы также можем создать новый столбец DataFrame на основе некоторых условий для другого столбца. Еще раз, для приведенного ниже кода мы можем использовать функции map()
или apply()
взаимозаменяемо:
df['col4'] = df['col3'].map(лямбда x: 30, если x < 30, иначе x) дф
col1 col2 col3 col4 0 1 0 10 30 1 2 0 20 30 2 3 0 30 30 3 4 0 40 40 4 5 0 50 50
Лямбда с
уменьшить()
Функция Функция reduce()
связана с модулем functools Python и работает следующим образом:
- Работает с первыми двумя элементами итерируемого объекта и сохраняет результат
- Работает с сохраненным результатом и следующим элементом итерации
- Продолжает таким образом над парами значений до тех пор, пока не будут использованы все элементы
итерации
Эта функция имеет те же два параметра, что и две предыдущие функции: функция и итерируемый объект. Однако, в отличие от предыдущих функций, эту не нужно передавать какой-либо другой функции, и она напрямую возвращает результирующее скалярное значение:
из functools импортировать уменьшить лст = [1, 2, 3, 4, 5] уменьшить (лямбда x, y: x + y, lst)
15
Приведенный выше код показывает функцию reduce()
в действии, когда мы используем ее для вычисления суммы списка (хотя для такой простой операции мы бы использовали лучшее решение: sum(lst)
).
Обратите внимание, что функция reduce()
всегда требует лямбда-функции ровно с двумя параметрами, а также что мы должны сначала импортировать ее из functools Модуль Python.
Плюсы и минусы лямбда-функции в Python
Плюсы
- Это идеальный выбор для вычисления одного выражения, которое
предполагается вычислять только один раз. - Его можно вызвать, как только он будет определен.
- Его синтаксис более компактен по сравнению с соответствующей обычной функцией
.