[英]What is the difference between Swift Closures, Java Closures, and Python Lambda expressions?
Swift 闭包和 Python Lambda 表达式有什么区别?
我经常看到网站将 Swift 闭包描述为类似于 Python lambda 表达式的东西。 它们具有相似的目的,甚至Swift 闭包文档指出
“Swift 中的闭包类似于 C 和 Objective-C 中的块以及其他编程语言中的 lambda。”
Python Lambda 表达式
sum = lambda a, b : a + b
Swift 闭合
var sum = { (a: Int, b: Int) -> Int in
return a + b
}
这两个代码的用途基本相同,我想知道它们在语言方面有何不同。
另一方面,Javascript 闭包似乎用于完全不同的目的。
function greeting() {
let message = 'Hi';
function sayHi() {
console.log(message);
}
return sayHi;
}
let hi = greeting();
hi();
据我了解,Swift 闭包类似于 Python lambda,但与 Javascript 闭包完全不同。 Swift 闭包是一流函数的实现,而 Javascript 闭包只允许访问参数列表之外的变量。
我很困惑 Javascript 闭包和 Swift 闭包之间是否存在任何联系,因为它们具有相同的名称。
闭包是一个 function,它的定义方式允许它携带从另一个上下文定义的值,通常是“更高”的 scope 之一。
您在 Java 中给出的示例就是其中之一。 在 Python 中,lambda 表达式不是闭包。 在 Python 中,我们将创建一个类似于您帖子中的 Java 示例的闭包。 这是 Python 闭包的示例:
def greet_boss(name):
def greet(person):
if person == name:
return "Yes sir!"
return f"Hello {name}"
return greet
greet_boss
包含greet
并返回 function。 因此,您可以执行以下操作: greet_boss("Obama")("Biden")
并获得“Hello Biden”。 但是如果你做greet_boss("Obama")("Obama")
你会得到“是的先生。”。
Swift 闭包也是这样。
在 Python 中,lambda 表达式是匿名 function 。 Lambda 表达式定义了一个可调用对象,其工作方式类似于 function,但它没有名称。 在 Python 中,最好只使用 lambda 表达式作为高阶函数的参数,例如map
和filter
以及其他将可调用作为参数的函数。 否则,您可能应该只使用一行def func...
。
在函数式编程语言中,函数是“第一个 class 公民”。 这意味着它们可以像数据一样传递(整数、字符串、arrays 等)。并非所有语言都以这种方式处理函数。 一些不是严格函数的语言(例如 Python)仍然具有第一个 class 函数。 在上面的示例中,函数由其他函数返回:返回函数是闭包。 您也可以将函数作为参数值传递给第一个 class。 例子:
def return_certain_times(list_of_times, time_filter):
out = []
for time in list_of_times:
if time_filter(time):
out.append(time)
return out
如果您有一周中的几天列表,您可以执行类似return_certain_time(my_times, lambda x: x == "Saturday')
类的操作,这将返回与“Saturday”匹配的所有时间的列表。(这不是您想要的 function 的一个很好的例子,但它很好地说明了这个概念。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.