这种方便的函数定义方式,如果翻译成大家熟知的函数形式,会是这样的:也就是说,Python中的lambda函数是一个可以接收多个参数的函数,返回值是一个表达式.它最大的优点是单行简洁,不需要函数命名和换行缩进。不得不说,匿名函数有时候是非常有用的,比如下面会介绍的一些常用用法,所以受到很多人的推崇。但是,匿名函数通常会使代码难以阅读并且容易被滥用。另外,Python只对它提供了“禁用”的支持,所以有些意见不建议使用匿名函数。事实上,Python之父GuidovanRossum属于“不推荐派”,但他最终还是妥协了。他甚至有一次(2005年)想删除lambda。Lambda,一个由其他开发者贡献的特性(借鉴自lisp语言),已经存在了十多年,却被语言的创造者(兼首席设计师)拒绝,最后奇迹般地活了下来接下来,你觉得这个故事怎么样是不是很戏剧化?https://jq.qq.com/?_wv=1027&k...接下来,本文就来聊一聊这个尴尬但顽强的lambda匿名函数!1.如何使用lambda?Lambda函数通常与map()、reduce()、filter()、sorted()等函数结合使用,这些函数的共同点是都可以接收其他函数作为参数。比如下面的例子:初学者可能会觉得代码看不懂,但是只要记住“Python中的函数是一等公民”,知道一个函数可以作为另一个函数的参数或者返回值就很容易了明白了。比如map()函数的例子,你可以这样理解:它甚至可以还原成一个普通的函数:map()函数的第一个参数是一个函数,第二个参数是一个可迭代的对象。第一个参数会迭代调用第二个参数中的元素,调用结果以迭代器的形式返回。本例使用list()是为了方便一次性取出迭代器中的元素并直观显示。在实际使用中,很可能是基于迭代器的。从以上几种用法,我们可以总结出lambda函数的使用规律:它出现在需要使用函数的地方。一般不单独使用。它总是用作其他功能的一部分。它适用于简单的功能。这是一次性使用,不能在其他地方重复使用2.lambda有什么问题?从上面的用法可以看出,使用lambda函数的代码比较紧凑简洁,所以有人说它体现了“Pythonic”的优雅思想。但是lambda函数没有任何缺点吗?有!目前lambda函数最大的问题是只支持单行表达式,无法实现丰富的功能。例如,它在创建函数时不能使用语句(statements),不能使用if-else判断条件,不能使用try-except异常捕获机制,等等。这极大地限制了它的能力,导致它被称为“残疾人”。从技术实现的角度来看,这个问题可以通过语法层面的设计来解决。在当年的邮件群讨论中,有人提出了一些解决方案,比如这封邮件:它提出了一个lambdaargs::suite的想法,支持写成这种形式:但是,Guido很快就否决了这个想法。我写了一篇文章《Language Design Is Not Just Solving Puzzles》作为回应:基本的观点是:你不能仅仅为了解决一个问题/实现某个功能而引入一种缺乏“Pythonicity”的语言设计。那么,为什么Guido认为这是一个糟糕的设计呢?我试着归纳一下,原因是:这里凭空引入了双冒号“::”,但它与切片语法中的“::”完全不同,也与作用域运算符的用法不同C++/Perl在lambda中实现其他功能并不重要,这也会使解析器变得更复杂(需要区分是否有缩进并记录缩进级别),这看起来很重要。接受,因为两者都在表达式中嵌入了缩进代码块。这与使用花括号和begin/end关键字进行语句分组是一样的,这是不可接受的。总之,他认为简洁友好的用户体验更为重要。如果简洁的语法不能满足要求,就应该写成命名函数的形式,而不是设计复杂的匿名函数。3.为什么Guido要去掉lambda?上面提到的多语句lambda事件发生在2006年,我们看到了Guido为什么不想在lambda中引入复杂的设计。然而,早在2005年,Guido就想将lambda从Python中移除,而他对它的“厌恶”是“由来已久”的传统……在这篇短文《The fate of reduce() in Python 3000》中,Guido提出了一次性移除lambda。除了reduce()、map()、filter()和lambda。去掉lambda的原因如下:很多人误以为匿名函数可以做嵌套函数做不到的事情,其实并没有什么区别;lambda的存在会造成不必要的选择,减少选择,简化思维。去掉reduce()、map()和filter(),就不用写短局部函数参数函数了)具有很强的“寄生关系”,如果能去掉,lambda就没有任何独立存在的意义了。那么,为什么Guido认为应该删除那几个高阶函数呢?主要原因是可以用更清晰的列表理解或生成器表达式代替,例如filter(P,S)可以写成[xforxinSifP(x)],map(F,S)可以写成[F(x)forxinS]至于reduce(),他说这个最烦人,除了少数+和*的用法,其他时候总是要拿出笔来和纸来画图来弄清楚。除了显式编写循环之外,他还提出了reduce()的几种替代用途,包括引入新的any()和all()函数。总的来说,Guido的想法与《The Zen of Python》不谋而合:应该有一种——最好只有一种——显而易见的方法来做到这一点。不过回到现实,出于照顾一些人的习惯和兼容性的考虑,圭多最终还是保守地放弃了“清理异端”的计划。因此,lambdas险些逃脱了Python最高独裁者的控制。直到一年后,它试图兴风作浪(多行表达),却遭到残酷镇压。我仿佛听到了Guido内心的OS:我想删东西的时候,你百般阻挠,现在你又想加东西,哼,不行!……哈哈,开个玩笑。Guido的所有决定都反映了他的Pythonic设计美学、自洽的逻辑一致性以及对社区声音的权衡。对于lambda,我很认同他的观点,感觉对Python的理解更丰富了。不知道你感觉如何?
