【问题标题】:Why would I assign an anonymous function to a variable? [closed]为什么要将匿名函数分配给变量? [关闭]
【发布时间】:2016-05-27 06:12:24
【问题描述】:

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

一些例子:

Clojure/Lisp

(def add2
    (fn [a] (+ 2 a))
(add2 4) ;; => 6

Python

add2 = lambda e: e + 2
add2(3) # => 5

斯卡拉

val add2 = (x: Int) => x + 2
add2(5) /* => 7 */

显然,这些只是一些微不足道的示例,但在生产代码中,我通常认为匿名函数是 one off 特定用例所需的函数(想想更高种类的类型等)。

谁能解释我为什么要为一个变量分配一个匿名函数?它是运行时/编译时的事情吗?是否有某些性能特征使其有利?

【问题讨论】:

  • 这实际上主要是基于意见/风格问题。但是在 Python 中使用像这样的 lambdas 除了使调试更加困难之外没有其他“目的”。
  • 当我需要 key 函数(例如 sort)并且我想在我使用它的同一行中定义函数时,我有时会为 lambda 函数指定一个名称参数感觉太简洁了,但定义一个常规函数感觉太冗长了。
  • 我今天早上确实这样做了。我正在测试 2 个具有不同实现但应该具有相同输入/输出的高阶函数。我将传入的函数绑定在let 中,然后在正文中使用它。我可以将它定义为一个具体的函数,但这对于快速测试来说已经足够了。

标签: python scala clojure anonymous-function


【解决方案1】:

我认为它的呈现方式更能让读者真正理解函数在所述语言中是一流的。如果他们只将它们用作其他函数的参数,也许这一点可能会丢失。但是以非常类似于值的方式使用它们,作为赋值的右手,或在 lambda 本身上调用方法等,使我们明白这些与数字、字符串、映射或语言中的任何其他值非常相似。

就我个人而言,我不使用这种模式,因为正如其他 cmets 所提到的,它使代码更难阅读和调试,而且在某些情况下,我还没有正确的函数声明 (Python) 的全部功能。

但是,当编写实际使用函数参数的代码时,或多或少就是这样做的。只有赋值比使用运算符更间接地发生。

【讨论】:

    【解决方案2】:

    根据Python Docs

    从语义上讲,它们只是普通函数定义的语法糖。

    afaik,lambda 没有任何特殊的性能特征使其受到青睐。如果您正在考虑将 lambdas 用于复杂任务,请三思而后行,使用函数。

    始终使用 def 语句而不是将 lambda 表达式直接绑定到标识符的赋值语句。

    编辑:添加了 StefanS 的建议

    【讨论】:

    【解决方案3】:

    在 Clojure 中,原因是您可以在多个地方使用该函数。其实

    (defn add2 [x] (+ x 2)
    

    只是简写

    (def add2 (fn [x] (+ x 2))
    

    【讨论】:

      猜你喜欢
      • 2019-03-27
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多