【问题标题】:What does "lambda" mean in Python, and what's the simplest way to use it?“lambda”在 Python 中是什么意思,最简单的使用方法是什么?
【发布时间】:2010-12-07 16:54:15
【问题描述】:

您能否举一个例子和其他例子来说明何时以及何时不使用 Lambda? 我的书给了我一些例子,但它们令人困惑。

【问题讨论】:

标签: python lambda


【解决方案1】:

Lambda 起源于 Lambda Calculus 并且 (AFAIK) 最初是在 Lisp 中实现的,它基本上是一个匿名函数 - 一个没有名称的函数,并且是内联使用的,换句话说,你可以将标识符分配给单个表达式中的 lambda 函数,如下所示:

>>> addTwo = lambda x: x+2
>>> addTwo(2)
4

这会将addTwo 分配给匿名函数,该函数接受1 个参数x,并在函数体中将x 加2,它返回函数体中最后一个表达式的最后一个值,因此没有return 关键字.

上面的代码大致相当于:

>>> def addTwo(x):
...     return x+2
... 
>>> addTwo(2)
4

除非您不使用函数定义,否则您正在为 lambda 分配一个标识符。

使用它们的最佳位置是当您真的不想用名称定义函数时,可能是因为该函数只会被使用一次次而不是多次,在这种情况下使用函数定义会更好。

使用 lambdas 的哈希树示例:

>>> mapTree = {
...     'number': lambda x: x**x,
...     'string': lambda x: x[1:]
... }
>>> otype = 'number'
>>> mapTree[otype](2)
4
>>> otype = 'string'
>>> mapTree[otype]('foo')
'oo'

在本例中,我并不想为其中任何一个函数定义名称,因为我只会在散列中使用它们,因此我将使用 lambda。

【讨论】:

  • 只是一个小小的挑剔的一个很好的答案:lambda 不是来自 Lisp,而是来自 lambda 演算。
  • 啊,是的,我使用 origin 的错误 - 我做了一些编辑。还有什么我应该添加/修改的吗?
  • +1 好答案,考虑在 dict 示例中更改名称 type.. 因为它是内置的...
  • 很好的答案,但我建议用更容易理解且更标准的东西替换示例。类似于在地图中使用 lambda (map(lambda x: x * 2, l))。
【解决方案2】:

我不知道您使用的是哪本书,但我认为Dive into Python has a section 提供了丰富的信息。

【讨论】:

  • 2017 年,万维网上的任何地方都没有diveintopython.org 网站!
【解决方案3】:

使用 lambda 是一种风格。当你可以摆脱一个非常简单的函数,并且通常你只是将它存储在某个地方(可能是在函数列表中,或者在 GUI 工具包数据结构中等)时,人们会觉得 lambda 减少了代码中的混乱。

在 Python 中,只能创建一个返回单个表达式的 lambda,并且 lambda 不能跨越多行(除非您使用反斜杠在行尾的技巧来连接多行)。人们已经要求 Python 为 lambda 添加改进,但它没有发生。据我了解,使 lambda 能够编写任何函数的更改将使 Python 中的解析代码显着复杂化。而且,由于我们已经有def 来定义一个函数,因此认为增益不值得复杂化。因此,在某些情况下,您可能希望在不可能的情况下使用 lambda。在这种情况下,您可以使用def

object1.register_callback_function(lambda x: x.foo() > 3)

def fn(x):
    if x.foo() > 3:
        x.recalibrate()
        return x.value() > 9
    elif x.bar() > 3:
        x.do_something_else()
        return x.other_value < 0
    else:
        x.whatever()
        return True

object2.register_callback_function(fn)
del(fn)

第一个回调函数很简单,一个 lambda 就足够了。对于第二个,根本不可能使用 lambda。我们通过使用def 并创建一个与名称fn 绑定的函数对象,然后将fn 传递给register_callback_function() 来实现相同的效果。然后,为了证明我们可以,我们在名称 fn 上调用 del() 以解除绑定。现在名称 fn 不再与任何对象绑定,但 register_callback_function() 仍然具有对函数对象的引用,因此函数对象继续存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2016-10-17
    • 2017-02-23
    • 1970-01-01
    • 2012-12-18
    • 2013-11-02
    • 2023-03-21
    相关资源
    最近更新 更多