【问题标题】:What exactly is "lambda" in Python?Python中的“lambda”到底是什么?
【发布时间】:2011-03-08 14:04:29
【问题描述】:

我想知道python中的lambda到底是什么?以及在哪里以及为什么使用它。 谢谢

【问题讨论】:

  • SO 需要一个密切的理由“第一次谷歌点击回答了问题”。
  • 不,所以应该是第一个谷歌点击...
  • 当一个主题已经有几十个非常好的解释、教程、参考和规范时,就不会了。
  • (公平地说,大多数谷歌点击将“功能”与“表达”混为一谈,就好像它们是同一个东西,下面的大多数答案也是如此——它们不是。)

标签: python lambda


【解决方案1】:

Lambda 更多的是一种概念或编程技术,而不是其他任何东西。

基本上,你得到一个函数(python 中的一等对象)作为另一个函数而不是对象或原始类型的结果返回的想法。我知道,这很混乱。

python documentation看这个例子:

def make_incrementor(n):
  return lambda x: x + n
f = make_incrementor(42)
f(0)
>>> 42
f(1)
>>> 43

所以 make_incrementor 创建了一个在结果中使用 n 的函数。您可以有一个函数将参数增加 2,如下所示:

f2 = make_incrementor(2)
f2(3)
>>> 5

这是函数式编程和函数式编程语言(如 lisp 和 scheme)中非常强大的想法。

希望这会有所帮助。

【讨论】:

  • Python 中的函数与其他对象没有什么不同,并且两者与变量的关系相同。顺便说一句,直接从另一个函数返回的lambdas 似乎不是lambda 使用的最常见示例——谷歌代码搜索说它们只占lambda 使用的5%。
  • 感谢您的澄清。我会看看我是否可以更新我对答案的尝试以使其更清楚。至于示例,它是由 python 文档选择的。 ;-) 这只是一个基本示例,可以帮助那些要求介绍 Python 概念的人。
  • @Dave 对不起,但这不是与 C/C++ 中的静态变量相同的操作吗?它保持相同的值等。 lambda 是一种在 python 中模拟静态变量的方法吗?提前致谢!
  • @GeoPapas 很抱歉回复晚了=D。不,静态变量和 lamdas 是不同的。首先,静态变量仍然是变量,而 lambda 是函数。具有 3 个 lambda 函数参数或复杂数据结构(如列表)的图像。您可以让复杂的业务逻辑在 lambda 函数中执行任何操作。此外,只有一个静态变量,而您可以有许多(无限)lambda。上例中的图像 f2 以及 f3 = make_incrementor(3)。 f2 将向 x 添加 2,f3 将添加 3。2 个不同的 lambda,每个宽度的值都不同,绑定到参数 n。
【解决方案2】:

Lambda 不是匿名函数。 Lambda 是匿名的表达式

它们像函数一样被访问,但它们不是一回事。函数允许复杂的任务:流控制、变量声明和包含表达式的语句列表。表达式只是函数的一部分,这就是 lambdas 给你的。与功能相比,它们受到严重限制。

Python 不支持匿名函数。有关这样做的语言示例,请参阅 Javascript 和 Lua。

(注意:在函数式语言中调用 lambdas 匿名函数是正确的,其中使用了“函数”的数学定义,但在过程语言中,该词的含义与数学中的含义截然不同。)

【讨论】:

  • +1,Lambdas are not anonymous functions. Lambdas are anonymous expressions。所以,如果我理解正确的话,可以说in Python, with lambda, you are able to parameterize your expression?谢谢
  • @eat:表达式总是参数化的——x*2 的参数是x。 Lambda 让您可以将表达式封装为一个对象。
  • parameter to x*2 is x,但我不这么认为(在这种情况下,参数是常数 2)。考虑line= lambda a, b: a* x+ b,现在我更愿意说我有一个表达式a* x+ b,带有参数ab,这意味着x 在定义line 时绑定,其余符号在定义时绑定line实际上是被调用的。我对 lambdas 的 2 美分。谢谢
【解决方案3】:

Lambda 函数不是 Python 特定的概念,而是匿名函数的通用编程术语,即没有名称的函数。在 Python 中,它们通常用于需要将简单函数作为参数传递给另一个函数的情况。

列表上的sort 方法采用参数key,这是一个用于计算列表排序值的函数。假设您正在对包含两个元素元组的列表进行排序,并且您希望根据第一个元素对列表进行排序。您需要将一个函数传递给key,它返回第一个元素。你可以这样做:

def first_element(x):
    return x[0]
my_list.sort(key=first_element)

或者,你可以更简洁:

my_list.sort(key=lambda x: x[0])

【讨论】:

    【解决方案4】:

    lambda 构造是定义计算单个表达式的简单函数的更短方法。 def 语句可能很不方便,并且会使代码更长、更分散且更难阅读。两者创建的函数在工作方式上几乎相同,不同之处在于lambda 仅限于一个表达式,其值被返回,def 为函数分配一个名称并将其添加到同名的局部变量。 lambda 也可以直接用在表达式中,而def 是一个语句。

    def f(x, y):
        return x + y
    

    会给你几乎

    相同的结果
    f = lambda x, y: x + y
    

    你可以直接在表达式中使用它

    g(5, 6, helper=lambda x, y: x + y)
    

    def 会不那么简洁

    def helper_function(x + y):
        return x + y
    
    g(5, 6, helper=helper_function)
    

    【讨论】:

    • 你说'def'和'lambda'的第一个例子会给你几乎相同的结果。结果会有什么不同?
    【解决方案5】:

    lambda 是一种定义匿名内联函数以完成某些任务的方法,而不是使用 def 关键字定义它并调用它。将其视为不需要重用函数时可以使用的简写。在任何使用 lambda 的地方,都可以替换为显式调用的函数:它的使用完全是可选的,并根据编码风格留给程序员。

    示例代码(不含 lambda):

    def numSquared(num):
        return num**2
    
    for i in range(1,11):
        print numSquared(i)
    

    示例代码(带有 lambda):

    for i in range(1,11):
        print (lambda x: x**2)(i)
    

    lambda的一个很好的初学者讨论: DiveIntPython.org - Lambda

    【讨论】:

    • diveinto python 链接已失效
    【解决方案6】:

    lambda 允许您在代码中定义简单的未命名函数,例如作为论据。如果您打算只使用该函数一次,这将很有用,因此不想让您的代码与命名函数混淆。

    假设您有一个数字列表 (thelist),并且您想获得一个长度相同的列表,每个数字都加倍。除了定义 times_two 函数,您还可以执行以下操作:

    map(lambda x: x * 2, thelist)

    lambda 也让Currying 更方便。

    【讨论】:

      【解决方案7】:

      谷歌搜索“python lambda”返回的第一个链接指向page,其第一段回答了您的问题。我可以复制并粘贴它的内容,但我认为这不公平:)

      【讨论】:

      • Andddd,现在链接失效了。
      【解决方案8】:

      这是一个内联匿名函数。

      【讨论】:

        【解决方案9】:

        lambda 是一个匿名函数,通常用于需要计算的快速操作。

        示例(在 LexYacc 命令解析器中使用):

        assign_command = lambda dictionary, command: lambda command_function: dictionary.setdefault(command, command_function)

        这是一个装饰器。放在我们从 LexYacc 解析器获得的命令之前: @assign_command(_command_handlers, 'COMMAND')

        这实质上是从定义的 LexYacc 语言构建一个 python 脚本。

        或者,更简单一点:

        `x = lambda x: 返回 x > 0 和 x & (x-1) == 0

        【讨论】:

          【解决方案10】:

          Lambda 可以直观地解释为代数函数。

          假设一个基本代数 y = x**2 + 1 如果直接输入,

          >>> y = x**2 + 1
          Traceback (most recent call last):
            File "<stdin>", line 1, in <module>
          NameError: name 'x' is not defined
          

          发生错误并报告应首先定义变量“x”。 不过,'x'是未知的,怎么能预定义呢。

          Lambda 帮助:

          python
          >>> y = lambda x: x**2 + 1  # no errors reports
          >>> y(3)
          10
          

          这就是 lambda 的核心,

          用编程语言编写内联函数。

          【讨论】:

            【解决方案11】:

            Lambda 是 Python 编程语言中的匿名函数,前面不带 def 语句,而是简单地调用和写成 lambda。

            def mult2(x):
                return x*2
            
            print(mult2(2))
            

            # 返回 4

            与 lambda 函数完全一样。

            lam = lambda x : x*2
            print(lam(2))
            

            # 返回 4 有关更多详细信息,您可以在此博客文章中查找。 http://friendlypython.herokuapp.com/2017/1/anonymous-function-lambda/here

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-08-15
              • 1970-01-01
              • 1970-01-01
              • 2016-07-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-06-05
              相关资源
              最近更新 更多