ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 6255|回复: 37

[分享] LAMBDA函数再升级:ETA REDUCED LAMBDA

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-1-18 15:19 | 显示全部楼层 |阅读模式
近期,微软更新了3个Excel工作表函数,分别是GROUPBY函数、PIVOTBY函数和PERCENT OF函数。同时,也对LAMBDA函数进行了升级和优化,也即ETA REDUCED LAMBDA(η精简的LAMBDA)。


η-REDUCTION(η是希腊字母表中第七个字母,REDUCTION一般翻译为约简或归约),读作艾塔或者伊塔约简,是在函数式编程中的一种重要概念。关于它的严谨概念我们不必深究,可以把它简单理解为一种"压缩"或"简化"的机制。在λ(希腊字母表中排序第十一位的字母,也即LAMBDA)演算中,由于一些函数可能会进行非常复杂的运算,导致其表现形式过于繁琐和复杂。这时,我们就可以利用η-约简的方法,"去掉"函数体内的一些对结果没有影响的计算步骤,从而使得这个函数变得更为简洁。

微软在此次更新时借鉴了这种约简方法,简化了LAMBDA函数的书写方式。例如,我们看以下的表达式:


LAMBDA(x, SUM(x))或LAMBDA(x, COUNTA(x))

上述LAMBDA函数中的SUM和COUNTA函数仅对参数x简单执行求和或计数运算,这些情况下Excel在此次更新之后可以直接使用SUM或COUNTA替换之前LAMBDA函数部分的书写。



以BYROW函数举例,之前按每行求和的写法如下:
图片.png

现在,我们可以这样写,使用SUM替换掉整个LAMBDA函数部分:
  1. =BYROW(B15:E22,SUM)
复制代码
图片.png

原则上,所有的工作表函数都可以看做是一个η-约简了的LAMBDA函数写法,都可以使用上述方法直接调用,只要保证执行函数默认操作行为时提供的参数能满足函数参数要求。


评分

15

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-18 15:26 | 显示全部楼层
一、关于支持的函数


在GROUPBY、PIVOTBY、BYROW等函数中输入到function参数时,函数会提示默认支持的一些简写函数(都稍有不同):
图片.png
图片.png
图片.png

这些默认提示支持的简写函数总结一下是下面几个:
图片.png

但在REDUCE、MAP等函数输入到LAMBDA函数部分时,并不会提示默认函数列表:
图片.png

虽然不提示,但是这种简写方式仍然是支持的,只要前面参数的输入能保证简写函数的参数要求。


评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-18 15:37 | 显示全部楼层
(接上楼)我们来随便观察几个默认支持的函数。
对每行数据求和运算:

图片.png

对每行的数据进行合并:

图片.png

求每行数字中重复出现次数最多的数字:
图片.png

观察这些函数的参数要求:
图片.png 图片.png 图片.png


之所以BYROW函数的LAMBDA函数运算题部分可以用这些函数名称简化书写,是因为BYROW函数提供的参数x(也即每一行的数据)符合后面这些函数的参数要求,直接作为一个数组参数执行后面SUM等函数的默认运算行为。


TEXTJOIN函数默认是不支持的:
图片.png

因为TEXTJOIN函数需要分隔符、是否忽略空值及待合并的字符这些参数,BYROW函数提供的x一个数组不满足参数要求。
图片.png


如果为TEXTJOIN函数提供了足够且正确的参数,那么TEXTJOIN函数也可以使用这种简写方法(没有什么意义,只是用来说明)。例如使用MAP函数的多参数用法:
  1. =MAP(G73:G80,H73:H80,OFFSET(A72:E72,ROW(1:8),),TEXTJOIN)
复制代码
图片.png

我们手动输入或使用公式生成一列分隔符及一列1作为MAP函数的前两个参数,使用OFFSET函数提取原数据的每行,最后LAMBDA函数运算题部分不需要写LAMBDA(x,y,z这种,直接写一个TEXTJOIN也可以完成合并运算。


评分

4

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-18 15:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
二、此次更新后,工作表函数的调用和Python中的函数调用方法就非常相似了,可以指定变量名,替代原函数名。


例如,使用LET函数将SUM指定为fx,直接使用fx即执行SUM函数运算:
  1. =LET(fx,SUM,fx(B87:E87))
复制代码
图片.png

当然,你也可以多次指定,再将gx指向fx,则gx执行SUM函数一样的运算:
  1. =LET(fx,SUM,gx,fx,gx(B87:E87))
复制代码

图片.png

也即:函数名都可以进行指定和替换,不仅仅限于上面举的简单例子,但还是建议使用常规函数名称为好,不要进行复杂指定,避免公式可读性变差。


评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-1-18 15:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
shaowu459 发表于 2024-1-18 15:42
二、此次更新后,工作表函数的调用和Python中的函数调用方法就非常相似了,可以指定变量名,替代原函数名。 ...

感谢超人老师分享,十分有用!!!
(且提一句,有些追求防御性编程的人说不定会故意追求可读性变差,将变量多次指定,再将gx指向fx

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-18 16:02 | 显示全部楼层
三、简写后的函数名,可以作为LAMBDA函数的参数传递运算方式。

例如在定义一个LAMBDA函数执行求和运算时,可以如下定义:
  1. =LAMBDA(x,x(B101:E108))(SUM)
复制代码

图片.png

SUM作为参数x传递进LAMBDA函数体部分运算。同样的,还可以使用其他函数:
图片.png
图片.png

还可以正常传入多个参数,函数名作为参数之一:
  1. =LAMBDA(x,y,x(y))(SUM,B101:E108)
复制代码

图片.png

但在使用这种方式时会有bug,群里冬佬提出的:
  1. =LAMBDA(x,y,z,x(z)-y(z))(MAX,MIN,B101:E108)
复制代码

图片.png

上面的公式返回错误值,但是在LET一下后,返回值正常:
  1. =LAMBDA(x,y,z,LET(s,x(z),t,y(z),s-t))(MAX,MIN,B101:E108)
复制代码

图片.png


BUG产生的原因目前不清楚,不知道以为微软会不会修复。但是错误值上有一些规律,随便做了一些测试,有兴趣的可以看下(不用深究,再怎么总结出错误值出现的规律也没有任何用处)。
单独返回一个值,正常:
图片.png
图片.png

以下搭配LET函数之后前两种返回正常,但第三种异常:
图片.png
图片.png
图片.png

再来看一组测试,交换两个返回值的位置:
图片.png
图片.png
图片.png

还可以做更多的测试,最后从现象上看,感觉是传递多个函数运算时,返回值的个数是够的,但是正确的返回值是从最右侧开始,只返回了最右边一半数量的正确结果,结果从右往左以:正确值+错误值+正确值+错误值……的方式返回:
  1. =LAMBDA(x,y,z,f,g,d,HSTACK(x(d),y(d),z(d),f(d),g(d)))(MAX,MIN,AVERAGE,SUM,MEDIAN,B101:E108)
复制代码

图片.png

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-18 16:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
四、可以使用IF函数或其他函数将比如一个SUM简写扩展成多行、多列。

例如,对下图中每行的Q1和Q2两个数据进行求和,也可以使用MAP函数(仅仅为示例构造用法,无实际意义。在GROUPBY等函数中会有实际应用):

  1. =MAP(IF(ROW(1:8),SUM),OFFSET(B113:C113,ROW(1:8),),LAMBDA(x,y,x(y)))
复制代码
图片.png

在上面的公式中,使用IF函数将单个SUM扩展为一列8行的SUM,作为MAP函数的第一参数,第二参数为OFFSET生成的多维引用,在LAMBDA函数部分使用x(y)即可进行对每行Q1和Q2两个数字的求和运算。


另外,可以复习一下前面楼层提到的指定变量名的方式,指定SUM为fx,直接调用fx执行求和运算:
图片.png

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-18 16:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 shaowu459 于 2024-1-18 16:13 编辑

五、不同的函数名称可以使用HSTACK函数、VSTACK函数进行堆叠,在GROUPBY等函数中有实际应用。

例如,下面的公式中使用VSTACK函数将函数名纵向堆积可以对一个数据源执行多种维度的统计运算并且纵向输出结果:
  1. =MAP(VSTACK(SUM,COUNT,MAX,MIN,AVERAGE),LAMBDA(x,x(B127:E134)))
复制代码
图片.png

同样的,也可以使用HSTACK函数横向输出:
  1. =MAP(HSTACK(SUM,COUNT,MAX,MIN,AVERAGE),LAMBDA(x,x(B127:E134)))
复制代码

图片.png

评分

5

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-1-18 16:13 | 显示全部楼层
感觉步子迈得有些大,导致编程函数可读性会越来越差,越来越难理解。

TA的精华主题

TA的得分主题

发表于 2024-1-18 16:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
超人老师永远走在最前沿
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-14 15:17 , Processed in 0.059127 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表