协慌网

登录 贡献 社区

为什么 Python lambdas 有用?

我想弄清楚 Python lambdas。 lambda 是现实生活中应该被遗忘的 “有趣” 语言项目之一吗?

我确信有一些可能需要它的边缘情况,但考虑到它的模糊性,它在未来版本中重新定义的可能性(我基于它的各种定义的假设)和降低的编码清晰度 - 应该是要避免吗?

这让我想起 C 类型的溢出(缓冲区溢出) - 指向顶部变量并重载以设置其他字段值。感觉就像是一种技术表演,但维护编码器的噩梦。

答案

你在谈论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] 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 函数。我花了一段时间才习惯他们,但最终我开始明白他们是语言中非常有价值的一部分。

lambda只是一种说法function的奇特方式。除了它的名字,它没有任何模糊,令人生畏或神秘的东西。当您阅读以下行时,请在脑海中按function替换lambda

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

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

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

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

两行摘要:

  1. 闭包 :非常有用。学习它们,使用它们,爱它们。
  2. Python 的lambda关键字:不必要,偶尔有用。如果你发现自己做了任何远程复杂的事情,就把它拿走并定义一个真正的功能。