我在试着找出Python的lambda。lambda是那些在现实生活中应该被遗忘的“有趣”语言项之一吗?
我确信有一些边缘情况可能需要它,但是考虑到它的模糊性,它在未来版本中被重新定义的可能性(我基于它的各种定义的假设)以及降低的编码清晰度——应该避免它吗?
这让我想起了C类型的溢出(缓冲区溢出)——指向顶部变量并重载以设置其他字段值。这感觉有点像技术人员的表演,但维护程序员的噩梦。
我在试着找出Python的lambda。lambda是那些在现实生活中应该被遗忘的“有趣”语言项之一吗?
我确信有一些边缘情况可能需要它,但是考虑到它的模糊性,它在未来版本中被重新定义的可能性(我基于它的各种定义的假设)以及降低的编码清晰度——应该避免它吗?
这让我想起了C类型的溢出(缓冲区溢出)——指向顶部变量并重载以设置其他字段值。这感觉有点像技术人员的表演,但维护程序员的噩梦。
当前回答
Lambdas通常与函数式编程风格密切相关。通过将函数应用于某些数据并合并结果来解决问题,这是谷歌用于实现其大多数算法的思想。
以函数式编程风格编写的程序很容易并行化,因此在现代多核机器中变得越来越重要。 所以简而言之,不,你不应该忘记他们。
其他回答
我已经使用Python好几年了,我从来没有遇到过需要lambda的情况。实际上,正如教程所述,这只是语法糖。
Lambdas通常与函数式编程风格密切相关。通过将函数应用于某些数据并合并结果来解决问题,这是谷歌用于实现其大多数算法的思想。
以函数式编程风格编写的程序很容易并行化,因此在现代多核机器中变得越来越重要。 所以简而言之,不,你不应该忘记他们。
我使用lambdas来避免代码重复。这样函数就容易理解了 例如:
def a_func()
...
if some_conditon:
...
call_some_big_func(arg1, arg2, arg3, arg4...)
else
...
call_some_big_func(arg1, arg2, arg3, arg4...)
我用一个临时变量替换它
def a_func()
...
call_big_f = lambda args_that_change: call_some_big_func(arg1, arg2, arg3, args_that_change)
if some_conditon:
...
call_big_f(argX)
else
...
call_big_f(argY)
Lambda是一个过程构造函数。你可以在运行时合成程序,尽管Python的lambda不是很强大。请注意,很少有人理解这种编程。
如上所述,Python中的lambda操作符定义了一个匿名函数,而Python中的函数是闭包。重要的是不要将闭包的概念与操作符lambda混淆,后者对它们来说只是句法上的美沙酮。
当我几年前开始使用Python时,我经常使用lambda,认为它们很酷,还有列表推导式。然而,我编写并维护了一个用Python编写的大型网站,其中有几千个功能点。我从经验中了解到,lambdas可能可以用来创建原型,但除了节省一些键,它不能提供任何内联函数(命名闭包),有时也不能。
基本上这可以归结为几点:
it is easier to read software that is explicitly written using meaningful names. Anonymous closures by definition cannot have a meaningful name, as they have no name. This brevity seems, for some reason, to also infect lambda parameters, hence we often see examples like lambda x: x+1 it is easier to reuse named closures, as they can be referred to by name more than once, when there is a name to refer to them by. it is easier to debug code that is using named closures instead of lambdas, because the name will appear in tracebacks, and around the error.
这就有足够的理由将它们集中起来,并将它们转换为命名闭包。然而,我对匿名闭包还有另外两个不满。
第一个不满是,它们只是又一个不必要的关键字,把语言弄得乱七八糟。
第二个不满是更深层次的,在范式层面上,也就是说,我不喜欢他们提倡一种函数式编程风格,因为这种风格不如消息传递、面向对象或过程式风格灵活,因为lambda微积分不是图灵完备的(幸运的是,在Python中,我们仍然可以在lambda内部突破这种限制)。我觉得lambdas推崇这种风格的原因是:
这里有一个隐式的返回,即它们看起来像“应该”是函数。 它们是另一种更显式、更可读、更可重用和更通用的机制——方法——的状态隐藏机制的替代方案。
我努力编写无lambda的Python,并在看到lambdas时删除lambdas。我认为如果没有lambdas, Python将是一种更好的语言,但这只是我的个人观点。