当我阅读文档或示例时,我经常会看到您可以为变量分配匿名函数的想法。为什么我会这样做而不只是定义一个新函数?
一些例子:
的Clojure / Lisp的
(def add2
(fn [a] (+ 2 a))
(add2 4) ;; => 6
的Python
add2 = lambda e: e + 2
add2(3) # => 5
Scala的
val add2 = (x: Int) => x + 2
add2(5) /* => 7 */
显然,这些都是微不足道的例子,但在生产代码中,我通常认为匿名函数是一个一个关闭函数,我需要特定的用例(想想更高级的类型等等) )。
任何人都可以解释为什么我会为变量分配一个匿名函数?它是运行时/编译时间吗?是否有某些性能特征使其有利?
答案 0 :(得分:1)
根据Python Docs:
从语义上讲,它们只是正常函数定义的语法糖。
afaik,lambda
没有特殊的性能特征使其有利。如果您正在考虑将lambda用于复杂任务,请再想一想,使用函数。
始终使用def语句而不是将lambda表达式直接绑定到标识符的赋值语句。
修改:添加了StefanS'建议
答案 1 :(得分:1)
我认为它的呈现方式更让读者真正理解所述语言中的功能是一流的。如果他们只将它们用作其他函数的参数,那么这一点可能会丢失。但是以一种非常有价值的方式使用它们,作为赋值的右手,或者在lambda本身上调用方法等等,这些都与数字,字符串,映射或语言中的任何其他值非常相似。
就个人而言,我没有使用这种模式,因为正如其他评论所提到的,它使代码更难以阅读和调试,以及在某些情况下没有正确功能声明(Python)的全部功能。
然而,当一个人正在编写实际使用函数参数的代码时,一个或多或少就是这样做的。只有分配比使用运算符更间接地发生。
答案 2 :(得分:0)
在Clojure中,原因是你可以在多个地方使用该功能。事实上
(defn add2 [x] (+ x 2)
只是
的简写(def add2 (fn [x] (+ x 2))