为什么要为变量分配匿名函数?

时间:2016-05-27 06:12:25

标签: python scala clojure anonymous-function

当我阅读文档或示例时,我经常会看到您可以为变量分配匿名函数的想法。为什么我会这样做而不只是定义一个新函数?

一些例子:

  

的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 */

显然,这些都是微不足道的例子,但在生产代码中,我通常认为匿名函数是一个一个关闭函数,我需要特定的用例(想想更高级的类型等等) )。

任何人都可以解释为什么我会为变量分配一个匿名函数?它是运行时/编译时间吗?是否有某些性能特征使其有利?

3 个答案:

答案 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))