对于一个没有计算机科学背景的人来说,计算机科学界的lambda是什么?
当前回答
Lambda为大家解释道:
Lambda是一个匿名函数。这意味着lambda是Python中的函数对象,以前不需要引用。让我们在这里考虑一下这段代码:
def name_of_func():
#command/instruction
print('hello')
print(type(name_of_func)) #the name of the function is a reference
#the reference contains a function Object with command/instruction
为了证明我的主张,我打印了name_of_func的类型,它返回我们:
<class 'function'>
函数必须有接口,但接口文档需要包含一些内容。这是什么意思?让我们更接近我们的函数,我们可能会注意到,除了函数的名称之外,我们还需要解释更多的细节,以了解函数是什么。
一个正则函数将用语法“def”定义,然后我们键入名称并用“()”结算接口,然后用语法“:”结束定义。现在,我们使用指令/命令进入函数体。
因此,让我们在这里考虑一下这段代码:
def print_my_argument(x):
print(x)
print_my_argument('Hello')
在本例中,我们运行名为“print_my_argument”的函数,并通过接口传递参数/参数。输出将为:
Hello
现在我们知道了什么是函数,以及函数的体系结构是如何工作的,我们可以看看一个匿名函数。让我们在这里考虑一下这段代码:
def name_of_func():
print('Hello')
lambda: print('Hello')
这些函数对象几乎相同,只是上面的常规函数有一个名称,而另一个函数是匿名的。让我们仔细看看我们的匿名函数,了解如何使用它。
因此,让我们在这里考虑一下这段代码:
def delete_last_char(arg1=None):
print(arg1[:-1])
string = 'Hello World'
delete_last_char(string)
f = lambda arg1=None: print(arg1[:-1])
f(string)
因此,我们在上面的代码中所做的是再次编写一个常规函数和一个匿名函数。我们将匿名函数分配给了一个var,这与为这个函数命名几乎相同。无论如何,输出将是:
Hello Worl
Hello Worl
为了充分证明lambda是一个函数对象,而不仅仅是模拟函数,我们在这里运行以下代码:
string = 'Hello World'
f = lambda arg1=string: print(arg1[:-1])
f()
print(type(f))
输出将为:
Hello Worl
<class 'function'>
最后但并非最不重要的是,您应该知道python中的每个函数都需要返回一些内容。如果函数体中未定义任何内容,则默认情况下将返回None。看看这里的这段代码:
def delete_last_char(arg1):
print(arg1[:-1])
string = 'Hello World'
x = delete_last_char(string)
f = lambda arg1=string: print(arg1[:-1])
x2 = f()
print(x)
print(x2)
输出将为:
Hello Worl
Hello Worl
None
None
其他回答
lambda是一种内联定义的函数类型。除了lambda之外,通常还有某种类型的变量类型,可以保存对函数lambda或其他函数的引用。
例如,这里有一段不使用lambda的C#代码:
public Int32 Add(Int32 a, Int32 b)
{
return a + b;
}
public Int32 Sub(Int32 a, Int32 b)
{
return a - b;
}
public delegate Int32 Op(Int32 a, Int32 b);
public void Calculator(Int32 a, Int32 b, Op op)
{
Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}
public void Test()
{
Calculator(10, 23, Add);
Calculator(10, 23, Sub);
}
这调用Calculator,不仅传递两个数字,还传递要在Calculator中调用的方法以获得计算结果。
在C#2.0中,我们得到了匿名方法,这将上述代码缩短为:
public delegate Int32 Op(Int32 a, Int32 b);
public void Calculator(Int32 a, Int32 b, Op op)
{
Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}
public void Test()
{
Calculator(10, 23, delegate(Int32 a, Int32 b)
{
return a + b;
});
Calculator(10, 23, delegate(Int32 a, Int32 b)
{
return a - b;
});
}
然后在C#3.0中,我们得到了lambdas,这使得代码更短:
public delegate Int32 Op(Int32 a, Int32 b);
public void Calculator(Int32 a, Int32 b, Op op)
{
Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}
public void Test()
{
Calculator(10, 23, (a, b) => a + b);
Calculator(10, 23, (a, b) => a - b);
}
lambda函数可以接受任意数量的参数,但它们只包含一个表达式。。。Lambda函数可用于返回函数对象。语法上,lambda函数仅限于一个表达式。
这个问题已经得到了正式的回答,因此我不会试图对此做更多的补充。
对于一个对数学或编程知之甚少或一无所知的人来说,用非常简单、非正式的话来说,我会把它解释为一个小的“机器”或“盒子”,它接受一些输入,产生一些工作,产生一些输出,没有特定的名称,但我们知道它在哪里,就凭这些知识,我们使用它。
实际上,对于一个知道函数是什么的人来说,我会告诉他们这是一个没有名字的函数,通常放在内存中的一个点上,只需引用该内存即可使用(通常通过使用一个变量-如果他们听说过函数指针的概念,我会将其用作类似的概念)-这个答案涵盖了非常基本的内容(没有提到闭包等),但人们可以很容易地理解这一点。
它指的是lambda演算,这是一个只有lambda表达式的形式系统,lambda表达式表示一个函数,该函数将一个函数作为其唯一参数并返回一个函数。lambda演算中的所有函数都是这种类型的,即λ:λ→ λ.
Lisp使用lambda概念来命名其匿名函数文字。此lambda表示一个函数,它接受两个参数x和y,并返回它们的乘积:
(lambda (x y) (* x y))
它可以这样在线应用(计算为50):
((lambda (x y) (* x y)) 5 10)
在CS的上下文中,lambda函数是一个抽象的数学概念,它解决了数学表达式的符号求值问题。在这种情况下,lambda函数与lambda项相同。
但在编程语言中,这是不同的。这是一段被宣布为“到位”的代码,可以作为“一流公民”传递。这个概念似乎很有用,因此它几乎进入了所有流行的现代编程语言(参见lambda函数everwhere post)。