Excel 已经够强大了,然而就在本月,Excel 宣布开始支持 λ 表达式。
微软是这么说的
参考:
https://techcommunity.microsoft.com/t5/excel-blog/announcing-lambda-turn-excel-formulas-into-custom-functions/ba-p/1925546
微软宣布 Excel 公式开始支持自定义函数。这将是 Excel 中使用公式的革命。Excel 公式是世界上最广泛应用的编程语言,没有之一。然而,作为编程语言,Excel 公式缺失了一些编程语言的天生特性。为了弥补,现在 Excel 推出了用公式定义公式并实现可重用的机制。
该机制基于来自广泛用于函数式编程领域的 λ 表达式理论。
按照微软的这段话来说,有两个重点:
首先,微软承认 Excel 公式就是编程的一种。
从此,使用 Excel 公式的人,也可以说自己是程序员了,所以,写不出来不要哭,要好好学习哦。
其次,为了补充 Excel 公式的能力,设计团队使用了 λ 表达式来扩充 Excel 公式的能力。
啥是 λ 表达式,表示完全听不懂,彻底蒙蔽了。
下面来一段科普。
啥是 λ 表达式
λ 表达式(读作:拉姆达表达式),来自 λ 演算,λ(Lambda(大写Λ,小写λ)读音:lan b(m) da(兰亩达)['læ;mdə])演算是一套用于研究函数定义、函数应用和递归的形式系统。它由数学家阿隆佐·邱奇在20世纪30年代首次发表。
听着好牛的样子,有没有?
λ 演算是图灵完备的,也就是说,这是一个可以用于模拟任何图灵机的通用模型。
图灵,有印象,是什么鬼?
在可计算性理论里,如果一系列操作数据的规则(如指令集、编程语言、细胞自动机)可以用来模拟单带图灵机,那么它是图灵完备的。这个词源于引入图灵机概念的数学家艾伦·图灵。
图灵机(英语:Turing machine),又称确定型图灵机,是英国数学家艾伦·图灵于1936年提出的一种抽象计算模型,其更抽象的意义为一种数学逻辑机,可以看作等价于任何有限逻辑数学过程的终极强大逻辑机器。
虽然图灵机会受到储存能力的物理限制,图灵完全性通常指“具有无限存储能力的通用物理机器或编程语言”。
听着这些词汇很嚣张有没有:任何有限逻辑数学过程的终极强大逻辑机器。注意:罗叔完全复制某度的专业解释,不敢乱加个人理解。
那么,λ 演算是图灵完备的,也就是说,这是一个可以用于模拟任何图灵机的通用模型。
λ 演算在数学、哲学、语言学和计算机科学中都有许多应用。它在程序语言理论中占有重要地位,函数式编程实现了 λ 演算支持。λ 演算在范畴论中也是一个研究热点。也就是说,这么强大的不讲武德的年轻人,被搞进了 Excel 里,而且以后我们都可以用到了。
大家不要再争了,我们都是程序员了。
没有错,有着良好初高中数学基础的伙伴,都可以在 Excel 里用公式编程了。
LAMBDA - λ 表达式在 Excel 里可以干啥坏事
Excel 有着已有的丰富函数系统,但是有一个遗憾:人们不能定义自己的函数。
有人会反对,那一定是 VBA 小哥哥了,VBA 小哥哥的确可以用 VBA 定义一个自定义的 Excel 函数,但着需要 Excel 的叔叔 VBA,现在 Excel 要让自己的孙子的儿子来做这件事,不要 VBA 叔叔管了。
也就是说,Excel 开始允许用户用单纯的 Excel 函数来定义任意自己想要的函数。
简答的说,这在 Excel 里可以做两件坏事:
- 定义可以重用的自定义函数
- 实现递归
举例子来说明吧。
实现自定义函数
举一个例子:
如果希望从 Station ID 列得到不含有数字部分的单词作为 Location,在 Location 列编写 Excel 函数如下:
代码语言:javascript复制=LEFT(RIGHT(B18,LEN(B18)-FIND("-",B18)),FIND("-",RIGHT(B18,LEN(B18)-FIND("-",B18)))-1)
能写出这个函数的,高考数学分数不会太低,这有两个问题:
- 如果某个逻辑用在多个地方,一旦要修改就要各处去修改。
- 可读性太差。Excel 就是离职时不满写下天书的绝佳阵地。
于是,这个叫 LAMBDA 的函数来了。他可以治愈所有问题。打开:
我们可以这么写了:
定义一个函数叫:GETLOCATION,内容如下:
代码语言:javascript复制=LAMBDA(stationID, LEFT(RIGHT(stationID,LEN(stationID)-FIND("-",stationID)),FIND("-",RIGHT(stationID,LEN(stationID)-FIND("-",stationID)))-1))
然后就可以这么用了:
可以使用自己定义的函数了,太神奇了。
实现递归
举一个例子:
现在我们想从 String 列去掉 Remove 列的内容而得到需要的东西,如上。
打开命名窗口:
定义这个函数叫:REMOVECHARS,内容如下:
代码语言:javascript复制=LAMBDA(textString, illegalChars,
IF(illegalChars="", textstring,
REMOVECHARS(
SUBSTITUTE(textString, LEFT(illegalChars, 1), ""),
RIGHT(illegalChars, LEN(illegalChars)-1)
)))
这个函数在定义的时候,居然可以自己调用自己。这就是递归。
然后就可以实现:
是不是很厉害。
名称管理器在哪里
晕。
这个大家都用过,只要定义名称就可以了。如下:
定义完成后:
接着就可以正常使用了。
为啥我的 Excel 没有这个函数
这是 Excel 的最新功能,位于测试频道,需要您的产品加入 Office 预览计划,大家不要着急,Excel 也是每个月都更新的,相信在普通版里很快就可以见到了。
在这里可以加入体验计划:https://insider.office.com/zh-cn/join/windows
此功能一出,Excel 界震动了,曾经的表哥表姐,由于有了 λ 表达式,都可以高高兴兴的成为程序员啦。
然而也有小伙伴感叹到:
Excel 完全不讲武德嘛,本来就已经够强大了,现在把拉姆达也搞进来了,人人都可以成为程序员啦,这好吗?这不好。
我劝一句:耗子为汁吧。
快说说您怎么看的~ 有没有大神一句话解释下啥是 λ 演算,实在看不懂~