对于一个没有计算机科学背景的人来说,计算机科学界的lambda是什么?
当前回答
想象一下,你有一家餐厅提供送货服务,你的订单需要在30分钟内完成。关键是客户通常不在乎你是骑自行车送食物还是赤脚送食物,只要你保持食物的温度并系好。因此,让我们将这个习惯用法转换为带有匿名和定义的传输函数的Javascript。
下面我们定义了交付的方式,也就是我们定义了函数的名称:
// ES5
var food = function withBike(kebap, coke) {
return (kebap + coke);
};
如果我们使用箭头/lambda函数来完成此传输会怎么样:
// ES6
const food = (kebap, coke) => { return kebap + coke };
你看,对客户来说并没有什么区别,也并没有浪费时间去思考如何发送食物。只要发送它。
顺便说一句,我不推荐用可乐烤串,这就是为什么上面的代码会给你错误。玩得高兴
其他回答
例如,在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]()()();
在计算机编程中,lambda是一段代码(语句、表达式或一组代码),它从外部源获取一些参数。它不能总是一个匿名函数——我们有很多方法来实现它们。
我们在表达式、语句和函数之间有明确的区分,而数学家没有这种区分。
编程中的“函数”一词也有所不同——我们有“函数是一系列要做的步骤”(来自拉丁语“perform”)。在数学中,它是关于变量之间的相关性。
函数语言正试图尽可能地与数学公式相似,它们的单词意思几乎相同。但在其他编程语言中,我们有不同之处。
这个问题已经得到了正式的回答,因此我不会试图对此做更多的补充。
对于一个对数学或编程知之甚少或一无所知的人来说,用非常简单、非正式的话来说,我会把它解释为一个小的“机器”或“盒子”,它接受一些输入,产生一些工作,产生一些输出,没有特定的名称,但我们知道它在哪里,就凭这些知识,我们使用它。
实际上,对于一个知道函数是什么的人来说,我会告诉他们这是一个没有名字的函数,通常放在内存中的一个点上,只需引用该内存即可使用(通常通过使用一个变量-如果他们听说过函数指针的概念,我会将其用作类似的概念)-这个答案涵盖了非常基本的内容(没有提到闭包等),但人们可以很容易地理解这一点。
对于一个没有计算机科学背景的人来说,计算机科学界的lambda是什么?
我将用简单易读的python代码一步一步直观地说明它。
简而言之,lambda只是一个匿名内联函数。
让我们从作业开始,了解兰达斯作为一名有基础算术背景的新生。
任务蓝图为“名称=值”,请参见:
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
它现在起作用了,如果你坚持将两条seperarte线合并为一条呢。lambda来了
In [13]: j = lambda i: i**2 + 2*i + 1
In [14]: j
Out[14]: <function __main__.<lambda>>
未报告错误。
这是对lambda的一瞥,它使您能够像在数学中那样在单行中直接将函数写入计算机。
我们稍后再看。
让我们继续深入了解“任务”。
如上所示,等号=适用于简单数据(1和“value”)类型和简单表达式(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
它适用于简单的语句,在python7中有11种类型。简单语句-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
Tada,分析一下,“m”是名称,“n**2+2*n+1”是值是“=”的变体。找到它,如果只是为了理解,一切都从任务开始,一切都是任务。
现在返回lambda,我们有一个名为“m”的函数
Try:
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
它叫做“匿名函数”
总之,
内联函数中的lambda,它使您能够像数学中那样在一条直线上编写函数lambda是匿名的
希望,这有帮助。
@Brian我一直在C#、LINQ和非LINQ运算符中使用lambdas。例子:
string[] GetCustomerNames(IEnumerable<Customer> customers)
{ return customers.Select(c=>c.Name);
}
在C#之前,我在JavaScript中使用匿名函数来回调AJAX函数,甚至在AJAX这个词出现之前:
getXmlFromServer(function(result) {/*success*/}, function(error){/*fail*/});
不过,C#lambda语法的有趣之处在于,它们本身的类型无法推断(即,您不能键入var foo=(x,y)=>x*y),但根据它们被分配给的类型,它们将被编译为表示表达式的委托或抽象语法树(这就是LINQ对象映射器如何实现“语言集成”的魔力)。
LISP中的Lambdas也可以传递给引号运算符,然后作为列表列表进行遍历。一些强大的宏是这样生成的。