我在试着找出Python的lambda。lambda是那些在现实生活中应该被遗忘的“有趣”语言项之一吗?

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

这让我想起了C类型的溢出(缓冲区溢出)——指向顶部变量并重载以设置其他字段值。这感觉有点像技术人员的表演,但维护程序员的噩梦。


当前回答

Lambda是一个过程构造函数。你可以在运行时合成程序,尽管Python的lambda不是很强大。请注意,很少有人理解这种编程。

其他回答

在我看来,lambda的一个好处是,它可以将简单表单的计算推迟到需要值时才进行。让我解释一下。

许多库例程的实现使得它们允许某些参数被调用(lambda是其中之一)。其思想是,实际值只在将要使用它的时候计算(而不是在调用它的时候)。一个(虚构的)例子可能有助于说明这一点。假设你有一个程序,它将记录一个给定的时间戳。您希望例程使用当前时间减去30分钟。你会这么说的

log_timestamp(datetime.datetime.now() - datetime.timedelta(minutes = 30))

现在假设实际函数只在某个事件发生时才被调用,并且您希望仅在该事件发生时计算时间戳。你可以这样做

log_timestamp(lambda : datetime.datetime.now() - datetime.timedelta(minutes = 30))

假设log_timestamp可以像这样处理可调用对象,它将在需要时计算这个值,届时您将获得时间戳。

当然,还有其他方法可以做到这一点(例如使用operator模块),但我希望我已经传达了这一点。

更新:这里有一个更具体的现实世界的例子。

更新2:我认为这是所谓的“坦克”的一个例子。

Lambdas通常与函数式编程风格密切相关。通过将函数应用于某些数据并合并结果来解决问题,这是谷歌用于实现其大多数算法的思想。

以函数式编程风格编写的程序很容易并行化,因此在现代多核机器中变得越来越重要。 所以简而言之,不,你不应该忘记他们。

只是函数的一种奇特说法。除了它的名字,它没有什么晦涩、吓人或神秘的地方。当你读到下面这行,在脑海中用函数替换lambda:

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

它只是定义了一个关于x的函数。其他一些语言,比如R,显式地说:

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

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

我刚开始学习Python,然后一头栽进Lambda——这花了我一段时间才弄明白。

请注意,这不是对任何事情的谴责。每个人都有不容易得到的东西。

lambda是那些在现实生活中应该被遗忘的“有趣”语言项目之一吗?

No.

我相信有一些边缘情况可能需要它,但考虑到它的模糊性,

它并不晦涩。在我过去工作过的两个团队中,每个人都一直在使用这个功能。

它在未来版本中被重新定义的可能性(我基于它的各种定义的假设)

除了几年前修复闭包语义之外,我还没有看到在Python中重新定义它的严肃建议。

编码清晰度的降低——应该避免吗?

如果你用对了,也不会不太清楚。相反,拥有更多可用的语言结构可以增加清晰度。

这让我想起了C类型的溢出(缓冲区溢出)——指向顶部变量并重载以设置其他字段值……有点像技术人员的表演技巧,但维护程序员的噩梦。

就像缓冲区溢出?哇。如果您认为lambda是一个“维护噩梦”,我无法想象您将如何使用它。

我怀疑lambda不会消失。 请参阅Guido关于最终放弃尝试删除它的帖子。也请参阅冲突概要。

你可以看看这篇文章,了解更多Python函数特性背后的交易历史: http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html

奇怪的是,最初引入lambda和其他函数特性的map、filter和reduce函数在很大程度上已经被列表推导式和生成器表达式所取代。事实上,在Python 3.0中,reduce函数已从内置函数列表中删除。(但是,没有必要投诉lambda、map或filter的删除:它们被保留了。: -)

我个人的意见是:就清晰度而言,lambda值不了多少。通常有一个更清晰的不包含的解。