gpt4 book ai didi

lambda - 大家一直在说的 'Lambda'是什么?

转载 作者:行者123 更新时间:2023-12-03 04:58:33 25 4
gpt4 key购买 nike

大家一直在谈论的“Lambda”是什么?很多人似乎喜欢它,但我只能从中了解到它只是将大量代码行塞入单个表达式的一种方式。

有人可以告诉我它的真正值(value)吗?

最佳答案

没有名称的函数

简单来说,lambda 就是一个没有名字的函数,或者说是匿名函数。一小段可执行代码,可以像变量一样传递。在 JavaScript 中:

function () {}; // very simple

现在让我们看看这些 lambda 的一些用途。

抽象样板代码

Lambda 可以用来抽象样板代码。例如循环。我们习惯于整天编写 forwhile 循环。但这是不写的代码。我们可以提取循环内的代码,即循环中最重要的部分,并抽象出其余部分:

for (var i=0; i<array.length; i++) {
// do what something useful with array[i]
}

通过使用forEach数组对象,变为:

array.forEach(function (element, index) {
// do something useful with element
// element is the equivalent of array[i] from above
});

上面的抽象可能没那么有用,但是还有其他更高阶的函数,例如 forEach,可以执行更有用的任务。例如filter :

var numbers = [1, 2, 3, 4];
var even = [];

// keep all even numbers from above array
for (var i=0; i<numbers.length; i++) {
if (numbers[i] % 2 === 0) {
even.push(numbers[i]);
}
}

alert(even);

// Using the filter method
even = [1, 2, 3, 4].filter(function (number) {
return number % 2 === 0;
});

alert(even);

代码执行延迟

在某些存在事件概念的环境中,我们可以使用 lambda 来响应可能在某个时间点发生的事件。

window.onload = function () {
alert("Loaded");
};

window.setTimeout(function () {
alert("Code executed after 2 seconds.");
}, 2000);

这可以通过其他方式完成,但这些方式相当冗长。例如,在 Java 中,有 Runnable 接口(interface)。

函数工厂

到目前为止,我们主要只是因为 lambda 的语法糖功能而使用它。但在某些情况下,lambda 可能会更有用。例如,我们可能有返回 lambda 的函数。假设我们有一个函数,我们希望缓存它的返回值。

var users = [];
var getUser = function (name) {
if (! users[name]) {
// expensive operations to get a user. Ajax for example
users[name] = user_from_ajax;
}

return users[name];
};

稍后,我们可能会注意到我们有一个类似的函数:

var photos = [];
var getPhoto = function (name) {
if (! photo[name]) {
// expensive operations to get a user. Ajax for example
photos[name] = photo_from_ajax;
}

return photos[name];
};

其中显然有一个模式,所以让我们将其抽象出来。让我们使用memoization .

/**
* @param {Array} store Data structure in which we cache lambda's return values
* @param {Function} lambda
* @return {Function} A function that caches the result of calling the lambda param
*/
var memoize = function (store, lambda) {
// return a new lambda
return function (name) {
if (! store[name]) {
// Execute the lambda and cache the result
store[name] = lambda(name);
}

return store[name];
};
};

var getUsers = memoize([], function (name) {
// expensive operations to get a user. Ajax for example
});

var getPhotos = memoize([], function (name) {
// expensive operations to get a photo. Ajax for example
});

如您所见,通过使用 lambda,我们能够抽象出缓存/内存逻辑。如果对于另一个示例有一些解决方法,我相信使用其他技术很难解决这个特定问题。我们设法将一些重要的样板代码提取到一个地方。更不用说我们删除了 usersphotos 全局变量。

查看您的个人资料,我发现您主要是 Python 用户。对于上面的模式,Python有装饰器的概念。有很多example on the net for memoization装饰者。唯一的区别是,在 Python 中,您很可能在该装饰器函数内有一个命名嵌套函数。原因是 Python 仅支持单表达式 lambda。但概念是一样的。

作为 Python lambda 使用的示例。上面我们过滤偶数的代码可以用 Python 表示,如下所示:

filter(lambda x: x % 2 == 0, [1, 2, 3, 4])

无论如何,如果没有闭包,lambda 就不会那么强大。闭包使得 lambda 的概念如此强大。在我的内存示例中,我使用闭包围绕 store 参数创建一个闭包。这样,即使在 memoize 函数返回其结果(lambda)之后,我也可以访问该参数。

关于lambda - 大家一直在说的 'Lambda'是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1085875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com