对于一个没有计算机科学背景的人来说,计算机科学界的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"]
其他回答
对于一个没有计算机科学背景的人来说,计算机科学界的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是匿名的
希望,这有帮助。
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
我喜欢这篇文章中对Lambdas的解释:LINQ的演变及其对C#设计的影响。这对我来说很有意义,因为它为Lambdas展示了一个真实的世界,并将其作为一个实际的例子。
他们的快速解释:Lambdas是将代码(函数)视为数据的一种方式。
有点过于简单:lambda函数是一个可以传递给其他函数的函数,它的逻辑被访问。
在C#中,lambda语法通常以与匿名委托相同的方式编译为简单方法,但它也可以分解并读取其逻辑。
例如(在C#3中):
LinqToSqlContext.Where(
row => row.FieldName > 15 );
LinqToSql可以读取该函数(x>15)并将其转换为实际的SQL以使用表达式树执行。
上述声明变为:
select ... from [tablename]
where [FieldName] > 15 --this line was 'read' from the lambda function
这与普通方法或匿名委托不同(它们实际上只是编译器的魔法),因为它们无法读取。
并非C#中所有使用lambda语法的方法都可以编译为表达式树(即实际的lambda函数)。例如:
LinqToSqlContext.Where(
row => SomeComplexCheck( row.FieldName ) );
现在无法读取表达式树-无法分解SomeComplexCheck。SQL语句将在没有where的情况下执行,数据中的每一行都将通过SomeComplexCheck进行处理。
Lambda函数不应与匿名方法混淆。例如:
LinqToSqlContext.Where(
delegate ( DataRow row ) {
return row.FieldName > 15;
} );
这也有一个“内联”函数,但这一次它只是编译器的魔法——C#编译器会将其拆分为一个具有自动生成名称的新实例方法。
匿名方法不能被读取,因此逻辑不能像lambda函数那样被翻译出来。
在CS的上下文中,lambda函数是一个抽象的数学概念,它解决了数学表达式的符号求值问题。在这种情况下,lambda函数与lambda项相同。
但在编程语言中,这是不同的。这是一段被宣布为“到位”的代码,可以作为“一流公民”传递。这个概念似乎很有用,因此它几乎进入了所有流行的现代编程语言(参见lambda函数everwhere post)。
推荐文章
- 设计模式:工厂vs工厂方法vs抽象工厂
- 为什么处理排序数组比未排序数组慢?
- 构造函数何时抛出异常是正确的?
- 什么是“一级”对象?
- 什么时候应该使用Debug.Assert()?
- 为什么浮点数不准确?
- 什么是端点?
- 字符、码位、字形和字素之间的区别是什么?
- 使用'key'和lambda表达式的Python Max函数
- IOException:进程不能访问文件“文件路径”,因为它正在被另一个进程使用
- 地图和字典的区别是什么?
- “函数”和“过程”的区别是什么?
- 如何使用Java8 lambda对流进行反向排序?
- 跳跃表vs.二叉搜索树
- Kotlin中的' forEach '中的' break '和' continue '