Что такое лямбда (функция)? - PullRequest
686 голосов
/ 19 августа 2008

Для человека без опыта работы в области компьютерных технологий, что такое лямбда в мире компьютерных наук?

Ответы [ 22 ]

4 голосов
/ 30 мая 2012

Только потому, что я не могу увидеть пример C ++ 11 здесь, я продолжу и выложу этот хороший пример из здесь . После поиска это самый понятный пример для конкретного языка, который я смог найти.

Здравствуйте, Lambdas, версия 1

template<typename F>

void Eval( const F& f ) {
        f();
}
void foo() {
        Eval( []{ printf("Hello, Lambdas\n"); } );
}

Здравствуйте, Lambdas, версия 2:

void bar() {
    auto f = []{ printf("Hello, Lambdas\n"); };
    f();
}
4 голосов
/ 19 августа 2008

Вы можете думать об этом как об анонимной функции - вот еще немного информации: Википедия - Анонимная функция

3 голосов
/ 17 ноября 2017

Для человека без опыта работы в области компьютерных технологий, что такое лямбда в мире компьютерных наук?

Я проиллюстрирую это интуитивно шаг за шагом в простых и удобочитаемых кодах Python.

Короче говоря, лямбда - это просто анонимная и встроенная функция.

Давайте начнем с задания, чтобы понять lambdas как новичка с основами арифметики.

План присвоения - «имя = значение», см .:

In [1]: x = 1
   ...: y = 'value'
In [2]: x
Out[2]: 1
In [3]: y
Out[3]: 'value'

'x', 'y' - это имена, а 1, 'value' - это значения. Попробуйте функцию по математике

In [4]: m = n**2 + 2*n + 1
NameError: name 'n' is not defined

Сообщения об ошибках,
Вы не можете написать математику непосредственно как код, 'n' должно быть определено или присвоено значению.

In [8]: n = 3.14
In [9]: m = n**2 + 2*n + 1
In [10]: m
Out[10]: 17.1396

Теперь это работает, что если вы настаиваете на объединении двух отдельных строк в одну. Приходит lambda

In [13]: j = lambda i: i**2 + 2*i + 1
In [14]: j
Out[14]: <function __main__.<lambda>>

Об ошибках не сообщается.

Это взгляд на lambda, он позволяет вам записать функцию в одну строку, как вы делаете это в математике непосредственно в компьютер.

Мы увидим это позже.

Давайте продолжим копать глубже на «задании».

Как показано выше, символ равенства = работает для простого типа данных (1 и «значение») и простого выражения (n ** 2 + 2 * n + 1).

Попробуйте это:

In [15]: x = print('This is a x')
This is a x
In [16]: x
In [17]: x = input('Enter a x: ')
Enter a x: x

Работает для простых операторов, в питоне их 11 типов 7. Простые утверждения - документация Python 3.6.3

Как насчет составного заявления,

In [18]: m = n**2 + 2*n + 1 if n > 0
SyntaxError: invalid syntax
#or
In [19]: m = n**2 + 2*n + 1, if n > 0
SyntaxError: invalid syntax

Приходит def включите его

In [23]: def m(n):
    ...:     if n > 0:
    ...:         return n**2 + 2*n + 1
    ...:
In [24]: m(2)
Out[24]: 9

Тада, проанализируй это, 'm' - это имя, 'n ** 2 + 2 * n + 1' - это значение. : - это вариант '='.
Найдите это, если только для понимания, все начинается с назначения, и все является назначением.

Теперь вернемся к lambda, у нас есть функция с именем 'm'

Попробуйте:

In [28]: m = m(3)
In [29]: m
Out[29]: 16

Здесь есть два имени 'm', функция m уже имеет дублированное имя.

Форматируется как:

In [27]: m = def m(n):
    ...:         if n > 0:
    ...:             return n**2 + 2*n + 1
    SyntaxError: invalid syntax

Это не умная стратегия, поэтому сообщения об ошибках

Мы должны удалить одну из них, установить функцию без имени.

m = lambda n:n**2 + 2*n + 1

Это называется «анонимная функция»

В заключение

  1. lambda во встроенной функции, которая позволяет написать функцию в одну прямую линию, как в математике
  2. lambda является анонимным

Надеюсь, это поможет.

3 голосов
/ 22 августа 2008

У меня проблемы с тем, чтобы обернуть голову вокруг лямбда-выражений, потому что я работаю в Visual FoxPro, которая имеет подстановку макросов и функции ExecScript {} и Evaluate (), которые, похоже, служат одной и той же цели.

? Calculator(10, 23, "a + b")
? Calculator(10, 23, "a - b");

FUNCTION Calculator(a, b, op)
RETURN Evaluate(op)

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

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

2 голосов
/ 21 августа 2016

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

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

2 голосов
/ 19 августа 2008

Это функция без имени. Например, в C # вы можете использовать

numberCollection.GetMatchingItems<int>(number => number > 5);

чтобы вернуть числа больше 5.

number => number > 5

здесь лямбда-часть. Он представляет функцию, которая принимает параметр (число) и возвращает логическое значение (число> 5). Метод GetMatchingItems использует эту лямбду для всех элементов коллекции и возвращает соответствующие элементы.

2 голосов
/ 10 августа 2009

Например, в Javascript функции обрабатываются как тот же смешанный тип, что и все остальное (int, string, float, bool). Таким образом, вы можете создавать функции на лету, назначать их вещам и вызывать их позже. Это полезно, но не то, что вы хотите чрезмерно использовать, иначе вы запутаете всех, кто должен поддерживать ваш код после вас ...

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

var x = new Object;
x.thingy = new Array();
x.thingy[0] = function(){ return function(){ return function(){ alert('index 0 pressed'); }; }; }
x.thingy[1] = function(){ return function(){ return function(){ alert('index 1 pressed'); }; }; }
x.thingy[2] = function(){ return function(){ return function(){ alert('index 2 pressed'); }; }; }

for(var i=0 ;i<3; i++)
    x.thingy[i]()()();
1 голос
/ 13 января 2019

A Lambda Function или Small Anonymous Function - это автономный блок функций, который можно передавать и использовать в вашем коде. Лямбда имеет разные названия на разных языках программирования - Lambda в Python и Kotlin , Closure в Swift или Block в C и Объективно-C . Хотя значение лямбда для этих языков довольно схоже, иногда оно имеет небольшие различия.

Давайте посмотрим, как Lambda (Closure) работает в Swift 4.2 с методом sorted () - от обычной функции до кратчайшего выражения:

let coffee: [String] = ["Cappuccino", "Espresso", "Latte", "Ristretto"]

1. Нормальная функция

func backward(_ n1: String, _ n2: String) -> Bool {
    return n1 > n2
}
var reverseOrder = coffee.sorted(by: backward)


// RESULT: ["Ristretto", "Latte", "Espresso", "Cappuccino"]

2. Закрытие Выражение

reverseOrder = coffee.sorted(by: { (n1: String, n2: String) -> Bool in
    return n1 > n2
})

3. Встроенное выражение закрытия

reverseOrder = coffee.sorted(by: { (n1: String, n2: String) -> Bool in return n1 > n2 } )

4. Вывод типа из контекста

reverseOrder = coffee.sorted(by: { n1, n2 in return n1 > n2 } )

5. Неявные возвраты из замыканий с одним выражением

reverseOrder = coffee.sorted(by: { n1, n2 in n1 > n2 } )

6. Сокращенные имена аргументов

reverseOrder = coffee.sorted(by: { $0 > $1 } )

// $0 and $1 are closure’s first and second String arguments.

7. Операторские методы

reverseOrder = coffee.sorted(by: >)

// RESULT: ["Ristretto", "Latte", "Espresso", "Cappuccino"]

Надеюсь, это поможет.

1 голос
/ 04 декабря 2012

Я тоже это понял. Я попробовал это в JS с этим:

var addAndMult = function(x) {
        return (function(y) {
            return (function(z) {
                return (x+y)*z; 
                });
            });
        };

Добавляет от 2 до 4, затем сравнивает результат на 6. Однако иногда мне трудно читать: (

Также я сделал интересную функцию forEach:

var forEach = function(arr) {
            return (function(x) {
            for (var i=0; arr[i]; i++) {
                 x(arr[i]);
             }
        });
    }

Foreach ([1,2,3,4,5]) (console.log);

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

1 голос
/ 10 июля 2017

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

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

Слово «функция» в программировании также отличается - у нас есть «функция - это последовательность шагов для выполнения» (от латинского «выполнять»). В математике речь идет о корреляции между переменными.

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

...