Lambda 表达式有什么用?
我正在尝试理解Python中的lambda表达式。这个lambda
是不是那种在实际编程中可以忽略的“有趣”语言特性呢?
我相信在某些特殊情况下它可能会有用,但考虑到它的复杂性、未来版本可能会重新定义它(这是我根据它的各种定义做的假设),以及它让代码变得不那么清晰——我们是不是应该尽量避免使用它呢?
这让我想起了C语言中的缓冲区溢出问题——指向顶部变量并重载来设置其他字段值。这感觉有点像技术上的炫耀,但对维护代码的人来说却是个噩梦。
26 个回答
两句话总结:
- 闭包:非常有用。学会它们,使用它们,喜欢它们。
- Python的
lambda
关键字:不太必要,有时有用。如果你发现自己用它做的事情有点复杂,那就放弃它,定义一个真正的函数吧。
lambda
其实就是个花哨的说法,意思就是function
(函数)。除了这个名字,其他的都没有什么难懂、让人害怕或者神秘的地方。当你看到下面这一行时,可以把lambda
在脑海中替换成function
:
>>> f = lambda x: x + 1
>>> f(3)
4
它只是定义了一个关于x
的函数。其他一些语言,比如R
,会明确地这样说:
> f = function(x) { x + 1 }
> f(3)
4
你看?这在编程中是最自然的事情之一。
你是在说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 函数。刚开始我花了一段时间适应它们,但最终我明白了它们是这个语言中非常重要的一部分。