Что такое лямбды и для чего они вообще нужны?

avatar cintems

844

15

cintems

Пользователь

Регистрация: 10.12.2018

Сообщения: 375

Рейтинг: 117

cintems

Регистрация: 10.12.2018

Сообщения: 375

Рейтинг: 117

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

LiL PEEP

Пользователь

Регистрация: 06.12.2018

Сообщения: 22616

Рейтинг: 27909

LiL PEEP

Регистрация: 06.12.2018

Сообщения: 22616

Рейтинг: 27909

буковка из халф лайфаpepecool.png?1592046811

shawinmihail

Пользователь

Регистрация: 08.02.2016

Сообщения: 233

Рейтинг: 87

shawinmihail

Регистрация: 08.02.2016

Сообщения: 233

Рейтинг: 87

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

Source107

Пользователь

Регистрация: 04.04.2015

Сообщения: 709

Рейтинг: 451

Source107

Регистрация: 04.04.2015

Сообщения: 709

Рейтинг: 451

Так же присваивать делегатам выражения

urusai88

Пользователь

Регистрация: 01.11.2018

Сообщения: 3351

Рейтинг: 1105

urusai88

Регистрация: 01.11.2018

Сообщения: 3351

Рейтинг: 1105

Лямбда это такая буква FeelsClownMan.png?1592047348

Лямбда-выражение это способ записи. На практике это анонимная функция, объявленная прямо в месте использования, например в выражении "map(a -> a.id)", "a -> a.id" является лямбда-выражением

shawinmihail сказал(а):

Фишка в том, что такую функцию можно объявить внутри другой, дефолтной функции, или в скрипте, а также передать в качестве аргумента в другую функцию.

Нажмите, чтобы раскрыть...

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

pochemyzamenya

Пользователь

Регистрация: 25.02.2016

Сообщения: 4459

Рейтинг: 4062

pochemyzamenya

Регистрация: 25.02.2016

Сообщения: 4459

Рейтинг: 4062

Что бы выпендриваться, зачем еще то.

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

7even7een

Пользователь

Регистрация: 23.04.2021

Сообщения: 979

Рейтинг: -52

Нарушения: 110

7even7een

Регистрация: 23.04.2021

Сообщения: 979

Рейтинг: -52

Нарушения: 110

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

AMDkrolyan

Пользователь

Регистрация: 21.04.2013

Сообщения: 7662

Рейтинг: 2908

Нарушения: 10

AMDkrolyan

Регистрация: 21.04.2013

Сообщения: 7662

Рейтинг: 2908

Нарушения: 10

cintems сказал(а):

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

Нажмите, чтобы раскрыть...

 

Это все пошло из лямбда вычислений (раздел математики такой)

 

Там две основные операции: Апликация и Абстракция

Простыми словами объясняю, для глубокого понимая гугли сам

 

1) Апликация - попросту применения аргумента в функции, по факту вызов функции f : x -> f(x) = y, y - value

2) Абстракция - конструировании функции на основе предыдущих что-то аля f(g(x)) 

 

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

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

То есть, если ты внутри лямбды, используешь переменную из скоупа, например метод. Эта переменная, обязана, быть неизменяемой, иначе нарушится консистентность 

ГовноКодер

Пользователь

Регистрация: 31.05.2021

Сообщения: 146

Рейтинг: -15

Нарушения: 100

ГовноКодер

Регистрация: 31.05.2021

Сообщения: 146

Рейтинг: -15

Нарушения: 100

cintems сказал(а):

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

Нажмите, чтобы раскрыть...

Пример лямбды

sum_of_a = lambda x: x+2

как бы было без лямбды

def  sum_of_a(x):

    return x+2

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

 

pochemyzamenya сказал(а):

Что бы выпендриваться, зачем еще то.

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

Нажмите, чтобы раскрыть...

Кстати да, я уже давно циклами не пользовался kekwwait.gif?1622490499

lexani4321

Пользователь

Регистрация: 28.03.2018

Сообщения: 13019

Рейтинг: 4063

lexani4321

Регистрация: 28.03.2018

Сообщения: 13019

Рейтинг: 4063

shawinmihail сказал(а):

Фишка в том, что такую функцию можно объявить внутри другой, дефолтной функции, или в скрипте, а также передать в качестве аргумента в другую функцию.

Нажмите, чтобы раскрыть...

Как и любую другую функцию.

ТСу - лямбда функция прост анонимно объявляется в одну строку. Всё. То есть если ты не засунешь её в переменную (funkciya = lambda x: x ** 2) то её сожрёт собиратель мусора(ну это в питоние так).

raven_cler

Пользователь

Регистрация: 10.04.2014

Сообщения: 587

Рейтинг: 103

raven_cler

Регистрация: 10.04.2014

Сообщения: 587

Рейтинг: 103

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

 

Главный вопрос при этом: а нафейхоа они такие нужны и как их применять на практике?

 

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

 

Например, удалить все 'NaN' из списка:

 

list(filter(lambda x : x != 'NaN', arr)) # Не затронет изначальный массив arr, просто создаст новый, в котором каждый элемент не равен NaN

 

Попробуй переписать то же самое(просто удалить из списка где есть несколько 'NaN' их все, не затрагивая изначальный список) через цикл с if-ом и ты почувствуешь разницу.

 

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

 

add = lambda a: lambda b: a + b 

add(2)(2) # вернёт 4

increment = add(1)

increment(2) # вернёт 3(2 + 1)

 

 

Armagedonby_ZERGS

Пользователь

Регистрация: 23.03.2015

Сообщения: 11371

Рейтинг: 4428

Armagedonby_ZERGS

Регистрация: 23.03.2015

Сообщения: 11371

Рейтинг: 4428

cintems сказал(а):

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

Нажмите, чтобы раскрыть...

За пайтон не знаю.

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

Все недостатки анонимных класов (нет конструкторов, возможность работать только с финализированными внешними переменными на месте).

raven_cler сказал(а):

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

Нажмите, чтобы раскрыть...

Это с какой радости? Ты спокойно можешь вызывать в лямбдах методы других объектов. Главное что бы ссылки были финализированы.

raven_cler сказал(а):

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

Нажмите, чтобы раскрыть...

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

raven_cler сказал(а):

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

Нажмите, чтобы раскрыть...

Точно так же можно объявлять в параметрах интерфейс (Патерн стратегия).

pochemyzamenya сказал(а):

Что бы выпендриваться, зачем еще то.

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

Нажмите, чтобы раскрыть...

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

pochemyzamenya

Пользователь

Регистрация: 25.02.2016

Сообщения: 4459

Рейтинг: 4062

pochemyzamenya

Регистрация: 25.02.2016

Сообщения: 4459

Рейтинг: 4062

Armagedonby_ZERGS сказал(а):

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

Нажмите, чтобы раскрыть...

Ну можно, кто ж спорит то

Хз почему ни кто за реактивное программирование не сказалFeelsRainMan.gif?1592102866

 

LearningEnglish

Пользователь

Регистрация: 28.06.2021

Сообщения: 17

Рейтинг: 9

Нарушения: 100

LearningEnglish

Регистрация: 28.06.2021

Сообщения: 17

Рейтинг: 9

Нарушения: 100

cintems сказал(а):

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

Нажмите, чтобы раскрыть...

Просто аноним функция

raven_cler

Пользователь

Регистрация: 10.04.2014

Сообщения: 587

Рейтинг: 103

raven_cler

Регистрация: 10.04.2014

Сообщения: 587

Рейтинг: 103

Armagedonby_ZERGS сказал(а):

Это с какой радости? Ты спокойно можешь вызывать в лямбдах методы других объектов. Главное что бы ссылки были финализированы.

Нажмите, чтобы раскрыть...

С такой, что это уже не лямбды, в том смысле, который в них вкладывал Чёрч, и который формализирован, а не зависит от хотелок разработчиков конкретного языка или технологии.

- Shtirlitz -

Пользователь

Регистрация: 21.03.2019

Сообщения: 1005

Рейтинг: 269

- Shtirlitz -

Регистрация: 21.03.2019

Сообщения: 1005

Рейтинг: 269

img
raven_cler сказал(а):

 Лямбды в отличии от обычных функций не должны делать каких-то побочных действий

Нажмите, чтобы раскрыть...

 

Я бы и обычные функции без побочных действий писал, а действия оставлял бы только в методах классов.  (Typescript). 

 

Хорошо, когда понятно с первого взгляда на код, есть побочные действия (внешние эффекты), или нет.  Обе конвенции позволяют этого добиться. 

 

Armagedonby_ZERGS сказал(а):

Это с какой радости? Ты спокойно можешь вызывать в лямбдах методы других объектов. Главное что бы ссылки были финализированы.

Нажмите, чтобы раскрыть...

Там речь шла о конвенции, мне кажется. 

 

Если говорить именно о коде в функционированальном стиле, то да. Функция не может содержать внешние эффекты + некоторые другие свойства. 

 

Но ключевое слово function (в JS, например) не обязывает разработка придерживаться функционального стиля! Отсюда и путаница.