
很多人学Python的时候,看到lambda这个关键字就觉得高级——一行搞定函数定义,多酷啊。然后到处用,能用的地方用,不能用的地方硬塞。
我以前也是这样,直到有一次code review被同事一句话怼了:"你这lambda写的,连自己都看不懂了吧?"
说实话,那句话让我反思了很久。
lambda到底是什么
一句话:lambda就是匿名函数,不需要关键字def、不需要函数名字、一行就能写完的小函数。

就这。
没什么神秘的。它能接收任意数量的参数,但只能写一个表达式,不能有多行逻辑,不能有if-else分支(除非用三元表达式那种一行搞定的)。
真正该用lambda的场景
lambda不是没用的东西,它的设计初衷是给那些"只需要用一次的小函数"提供一个简洁写法。
最典型的场景是配合map、filter、sorted这些高阶函数。
排序是最常见的用法。假设你有一个列表,里面是字典,每个字典代表一个学生,你想按成绩排序:

这个场景用lambda就很舒服,因为排序规则很简单,就取一下score字段,没必要单独定义一个函数。写def反而显得啰嗦。
filter和map也是类似:

不过说实话,这两个场景在Python里用列表推导式更Pythonic,很多人推荐用[x**2 for x in range(10)]代替map + lambda,可读性确实更好。
不该用lambda的场景
这是我踩坑最多的地方。
第一个雷区:lambda里套复杂逻辑。
有人用三元表达式把if-elif-else全塞进一行lambda里,写完之后过两个月再看,根本不知道自己在写什么。lambda的定位是"简单的一次性函数",一旦逻辑超过一行的阅读负担,就该老老实实用def。
第二个雷区:用lambda给函数起别名。
my_func = lambda x: some_other_func(x)这种写法完全没必要,直接my_func = some_other_func就行。多写lambda反而增加了一层不必要的包装。
第三个雷区:lambda的调试体验很差。
因为它没有名字,出错的时候堆栈信息里只会显示<lambda>,你根本不知道是哪个 lambda出了问题。如果你的代码里有十几个lambda,排查错误的时候会很头疼,够你喝一壶的。
一个常被忽略的细节
lambda没有docstring。这意味着你没法给它写文档说明。如果你的函数需要让别人理解它的用途和参数含义,lambda就不是好选择。def函数可以写docstring、可以加类型注解、可以做完整的文档,lambda什么都做不了。
我的看法
lambda是个好工具,但它被过度神化了。Python社区里一直有个争论——lambda到底该不该存在。Guido van Rossum(Python之父)曾经好几次想把它从Python 3里去掉,最后因为社区反对才保留了下来。
我自己现在的习惯是:lambda只用在排序的key参数和极少数配合高阶函数的场景里,其他地方一律用def。
代码是写给人看的,不是写给机器看的,可读性永远排在"看起来酷"前面。
别为了省几行代码,让下一个读你代码的人骂你。
以上就是“Python匿名函数:用了三年lambda,我才发现80%的场景根本不需要它!”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料

- 本文固定链接: http://www.phpxs.com/post/14108/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料