Python 中的万能之王 Lambda 函数
哎我跟你说,我昨晚十一点半在客厅那儿,一边啃着泡面一边改个脚本,结果小李突然在群里问我:“东哥那个 Python 里那个什么…那个匿名函数啥来着…怎么用啊?”我当时脑子有点糊,你知道吧,刚准备回去睡觉的那种。但越想越停不下来——lambda 这东西吧,看着小小一坨,其实是个特别能干的家伙。
我就随口跟他说:“你就理解成…嗯…那种快速写个小函数,不想给名字,写完就走那种,你懂吧?”他说听不懂。算了我也懒得解释,就边吃边随手敲了个例子发过去:
r = list(map(lambda x: x * 2, [1, 2, 3]))
print(r)
我说,“你看,就这么一坨…怎么说呢…就像你路边摊买煎饼时跟老板说少放点辣,多加个蛋,你给命令,他直接干完就走,不会给你建个‘加蛋’类的那种大工程。”
他说:“哦,好像懂了一点。”
我继续跟他扯,你知道我一犯困就容易话多。我说 lambda 最大的特点就是快——不是运行快,而是你写得快。有时候我在公司楼下抽烟那会儿,有个数据处理脚本要临时改,比如说根据某个字段动态排序,不想去上面单独写个函数,就直接来一句:
data.sort(key=lambda item: item["score"])
然后继续抽烟,不打扰我的节奏。
不过 lambda 也不是万能药,就是那种…能用但别乱用的感觉。之前我们组一个哥们儿写个业务逻辑,几百行代码里塞了十几个嵌套 lambda,我看到直接头皮发麻,像卷饼一样卷在一起,我还骂他说:“你这玩意儿以后谁来改?你自己过俩月都不认识了。”他还回我说看着很高级。我说高级个屁。
其实说白了,lambda 几个常见的用途吧,我那天也顺嘴说了:
就比如过滤嘛——那天我在咖啡机旁边灌美式,小王问我怎么把列表里偶数挑出来,我懒得解释,直接甩他:
nums = [1, 2, 3, 4, 5, 6]
print(list(filter(lambda x: x % 2 == 0, nums)))
他点点头说懂了,其实根本没懂。
还有啥来着…哦,做 key 函数特别爽,比如排序、分组那种小逻辑。前几周有个需求要按文件名后缀排序,我就在工位上吃煎饼边敲了一句:
files.sort(key=lambda f: f.split('.')[-1])
然后我煎饼掉桌子上了,心疼了一秒,但排序成功了也算赚了。
当然 lambda 也有坑,比如太长的时候,你得回想一件事——匿名函数“匿名”的原因,是它本来就该很短,长了你还不用普通函数写,那就是你自己的问题了。就前两天我 review 小李的代码,他写了个三行换行的 lambda,还带逻辑判断,我直接让他删了换成正常 def,不然半年后回头看他自己都打不过自己。
我当时还随口总结了一句(反正他也听不进去):lambda 就像拧个瓶盖那样的操作——顺手、小巧、临时用一下特别好,但你别都用它拧家具螺丝。
然后我泡面吃完了,他那边还在问我,“那什么时候不用 lambda 啊?”我实在困得不行,说你就记住一句:当你开始觉得它不好读的时候,你就别用了。
结果我说完就去睡了,手机还没静音,小李继续发语音我根本没听。
哎反正我现在咖啡还没喝完,脑袋还是懵的,你要是真的想搞懂 lambda,就自己敲个几次,别整那些花里胡哨的,我这会儿还得回去把刚才的脚本改完…算了先喝口咖啡吧。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB