45

我很好奇lambda函数和常规函数(用 定义def)之间的区别 - 在 python 级别。(我知道程序员有什么区别以及何时使用它们。)

>>> def a():
    return 1

>>> b = lambda: 1
>>> a
<function a at 0x0000000004036F98>
>>> b
<function <lambda> at 0x0000000004031588>

正如我们所看到的 - python知道b是一个lambda函数并且a是一个常规函数。这是为什么?它们与 python有什么区别?

4

6 回答 6

38

它们是相同的类型,因此它们的处理方式相同:

>>> type(a)
<type 'function'>
>>> type(b)
<type 'function'>

Python 也知道它b被定义为 lambda 函数,并将其设置为函数名称:

>>> a.func_name
'a'
>>> b.func_name
'<lambda>'

换句话说,它会影响函数将获得的名称,但就 Python 而言,两者都是函数,这意味着它们大部分可以以相同的方式使用。有关酸洗的函数和 lambda 函数之间的重要区别,请参见下面的 mgilson 评论。

于 2012-09-04T13:47:14.157 回答
15

唯一的区别是 (a) lambda 的主体只能包含一个表达式,其结果是从创建的函数返回的;(b)lambda表达式是计算结果为函数对象的表达式,而def语句没有值,并创建一个函数对象并将其绑定到一个名称。

在所有其他材料方面,它们产生相同的对象 - 适用相同的范围和捕获规则。(无关紧要的区别是lambda-created 函数的默认func_name值为"<lambda>"。这可能会影响深奥情况下的操作 - 例如尝试腌制函数。)。

于 2012-09-04T13:50:07.413 回答
1

首先考虑两者的差异。

Lambda 函数: are 运算符可以有任意数量的参数,但它只能有一个表达式。它不能包含任何语句,它返回一个可以分配给任何变量的函数对象。它们可以在创建的块中使用。

def 函数:函数有助于将我们的程序分解成更小的和模块化的块。随着我们的程序变得越来越大,功能使其更有条理和更易于管理。它们可以在我们想要的任何地方调用和使用。

在这里,您可以通过以下示例获得更明显的区别。

定义一个函数

    def add(a,b):
      return a+b
    print(add(4,5))

定义一个 lambda

    add = lambda x, y : x + y 
    print(add(4,5))
于 2019-12-14T05:14:02.690 回答
1

两者都lambda创建def相同类型的功能——它们具有相同类型的元数据和功能。它们的技术区别在于语法

  • Alambda是产生函数的表达式。
  • Adef是产生函数的语句。

这就是决定如何使用它们的一切。其他明显的差异仅来自信息lambda/def可以捕获。

>>> def def_func(): pass
>>> lambda_func = lambda: None
>>> type(def_func) == type(lambda_func)
True

用法:表达式与语句

Alambda更灵活,因为表达式可以是更多语言结构的一部分。

#                v--------------v arguments must be expressions
sort(values, key=lambda x: abs(x))

相比之下,adef更强大,因为它可以包含更多的语言结构。

def encode(num, base):
    while num:   # statements must be inside statements
        num, bit = divmod(num, base)
        yield bit

这些差异直接源于一个是表达式,另一个是语句。Python 没有特殊的规则来决定lambda/def可以在哪里使用。


野性<lambda>生长的地方

lambda假设和def对应不同类型函数的主要原因是元数据lambda通常被称为“匿名函数”,而且奇迹般地它总是产生一个function <lambda>. 其他怪癖包括“无法腌制 lambda 函数”,最近键入也对lambda.

这是因为与def语法相比,lambda语法无法指定名称、类型注释等。因此,Python 只是简单地为任何一个填充了合理的默认值:名称变为<lambda>,注释为空。

>>> identity = lambda a: a
>>> identity.__qualname__
'<lambda>'
>>> identity.__annotations__
{}

由于<lambda>不是有效的标识符,因此使用此元数据查找函数的所有操作(最突出的是pickle)都会失败。

但是,这并不会使函数成为“匿名函数”类型。可以修补元数据以插入def将提供的内容:

>>> identity.__qualname__ = identity.__name__ = 'identity'
>>> identity
<function __main__.identity(a)>

当然,在那一点上,人们可以使用def……</p>

于 2021-10-12T08:25:13.597 回答
0

lambda创建一个匿名函数。这个想法取自函数式编程语言。通过这种方式,您可以创建函数并将其传递给其他函数,例如mapfilter。(看这里
您也可以将普通函数传递给这些函数,但由于它们大多很简单,并且不会在其他任何地方使用,因此定义新函数的整个过程很不方便。

作为一个例子,看看这个:

>>> a = [1, 2, 3, 4]
>>> print map( lambda x : x*2 + 1, a )
[3, 5, 7, 9, 11]
于 2012-09-04T14:01:23.580 回答
0

Lambda 是一个内联函数,我们可以在其中执行任何没有函数名称的功能。当我们将它用作高阶函数的参数时,它会很有帮助。例如:一个将其他函数作为参数的函数。

函数定义示例:

>>> def func(a, b):
    return a * b

>>> func(2,3)
6
>>> type(func)
<class 'function'>
>>> func
<function func at 0x034B6E88>

Lambda 表达式示例:

>>> multiply = lambda a, b: a * b
>>> multiply(2, 3)
6
>>> type(multiply)
<class 'function'>
>>> multiply
<function <lambda> at 0x034B6ED0>

两者都返回相同的输出值。只有返回的对象不同。Function 和 Lambda 的“func”名称。

于 2018-09-10T12:57:46.750 回答