Lambda 表达式有什么用?

985 投票
26 回答
589101 浏览
提问于 2025-04-15 11:44

我正在尝试理解Python中的lambda表达式。这个lambda是不是那种在实际编程中可以忽略的“有趣”语言特性呢?

我相信在某些特殊情况下它可能会有用,但考虑到它的复杂性、未来版本可能会重新定义它(这是我根据它的各种定义做的假设),以及它让代码变得不那么清晰——我们是不是应该尽量避免使用它呢?

这让我想起了C语言中的缓冲区溢出问题——指向顶部变量并重载来设置其他字段值。这感觉有点像技术上的炫耀,但对维护代码的人来说却是个噩梦。

26 个回答

110

两句话总结:

  1. 闭包:非常有用。学会它们,使用它们,喜欢它们。
  2. Python的 lambda 关键字:不太必要,有时有用。如果你发现自己用它做的事情有点复杂,那就放弃它,定义一个真正的函数吧。
404

lambda其实就是个花哨的说法,意思就是function(函数)。除了这个名字,其他的都没有什么难懂、让人害怕或者神秘的地方。当你看到下面这一行时,可以把lambda在脑海中替换成function

>>> f = lambda x: x + 1
>>> f(3)
4

它只是定义了一个关于x的函数。其他一些语言,比如R,会明确地这样说:

> f = function(x) { x + 1 }
> f(3)
4

你看?这在编程中是最自然的事情之一。

1062

你是在说lambda 表达式吗?比如说:

lambda x: x**2 + 2*x - 5

这些东西其实非常有用。Python 支持一种叫做 函数式编程 的编程风格,你可以把函数传递给其他函数来完成一些操作。举个例子:

mult3 = filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])

这段代码会把 mult3 设置为 [3, 6, 9],也就是原始列表中所有能被 3 整除的元素。这样写比下面的方式更简洁(而且有人会说更清晰):

def filterfunc(x):
    return x % 3 == 0
mult3 = filter(filterfunc, [1, 2, 3, 4, 5, 6, 7, 8, 9])

当然,在这个特定的情况下,你也可以用列表推导式来实现同样的功能:

mult3 = [x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9] if x % 3 == 0]

(甚至可以用 range(3,10,3)),但在很多其他更复杂的场景中,你可能无法使用列表推导式,这时候用 lambda 函数可能是写出代码的最简便方法。

  • 从另一个函数返回一个函数

      >>> def transform(n):
      ...     return lambda x: x + n
      ...
      >>> f = transform(3)
      >>> f(4)
      7
    

    这通常用来创建函数包装器,比如 Python 的装饰器。

  • reduce() 合并可迭代序列的元素

      >>> reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])
      '1, 2, 3, 4, 5, 6, 7, 8, 9'
    
  • 按其他关键字排序

      >>> sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))
      [5, 4, 6, 3, 7, 2, 8, 1, 9]
    

我经常使用 lambda 函数。刚开始我花了一段时间适应它们,但最终我明白了它们是这个语言中非常重要的一部分。

撰写回答