对于一个没有计算机科学背景的人来说,计算机科学界的lambda是什么?


当前回答

Lambda函数或小型匿名函数是一个自包含的功能块,可以在代码中传递和使用。Lambda在不同的编程语言中有不同的名称——Python和Kotlin中的Lambda,Swift中的闭包,或者C和Objective-C中的Block。虽然lambda在这些语言中的含义非常相似,但有时会有细微差别。

让我们看看Closure(Lambda)在Swift中的工作原理:

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"]

其他回答

我喜欢这篇文章中对Lambdas的解释:LINQ的演变及其对C#设计的影响。这对我来说很有意义,因为它为Lambdas展示了一个真实的世界,并将其作为一个实际的例子。

他们的快速解释:Lambdas是将代码(函数)视为数据的一种方式。

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函数仅限于一个表达式。

它是一个没有名称的函数。例如,在c#中,您可以使用

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

返回大于5的数字。

number => number > 5

这里是lambda部分。它表示一个接受参数(数字)并返回布尔值(数字>5)的函数。GetMatchingItems方法对集合中的所有项使用此lambda并返回匹配项。

这个问题已经得到了充分的回答,我不想详述。我想分享在rust中编写数值计算时的用法。

有一个lambda(匿名函数)的示例

let f = |x: f32| -> f32 { x * x - 2.0 };
let df = |x: f32| -> f32 { 2.0 * x };

当我写牛顿-拉斐逊方法的一个模块时,它被用作一阶导数和二阶导数。(如果您想知道什么是牛顿-拉斐逊法,请访问“https://en.wikipedia.org/wiki/Newton%27s_method".

输出如下

println!("f={:.6}      df={:.6}", f(10.0), df(10.0))

f=98.000000       df=20.000000