今天介紹嵌套LAMBDA函數(shù)的使用。 LAMBDA函數(shù)的語法如下: 其中的parameter是參數(shù),可以是數(shù)組,單元格區(qū)域,數(shù)值,或者LAMBDA函數(shù)。 最后的calculation也可以是LAMBDA函數(shù)。如果是這樣,我們就使用了嵌套的LAMBDA函數(shù)。 例如, TESTFUNC = LAMBDA(x, LAMBDA(a, a + x)) 就是一個(gè)嵌套的LAMBDA函數(shù)。 TESTFUNC的邏輯非常簡(jiǎn)單,一眼就可以明白它要什么。但是要分析其運(yùn)行過程卻并不是一目了然的。 其使用邏輯可以用下圖表示: 對(duì)這個(gè)函數(shù)的調(diào)用使用公式: =TESTFUNC(x) x被作為參數(shù)傳遞給外層的LAMBDA函數(shù),外層的LAMBDA函數(shù)需要根據(jù)計(jì)算邏輯處理并返回。這個(gè)計(jì)算邏輯就是內(nèi)層的LAMBDA函數(shù): =LAMBDA(a, a+X) 這里的a是參數(shù),x不再是參數(shù)。x是外層LAMBDA函數(shù)傳遞進(jìn)來的,對(duì)內(nèi)層LAMBDA函數(shù)來說,相當(dāng)于常量。 內(nèi)層的LAMBDA函數(shù)需要根據(jù)計(jì)算邏輯返回,這個(gè)計(jì)算邏輯就是: a+x 這個(gè)函數(shù)并不能像以前我們創(chuàng)建過的自定義函數(shù)一樣調(diào)用。 注意,外層的LAMBDA函數(shù)只能接收一個(gè)參數(shù),所以,只能寫成: =TEXTFUNC(10) 根據(jù)上面的分析,這個(gè)公式返回了一個(gè)LAMBDA函數(shù): LAMBDA(a,a+x) 顯然,此時(shí)x=10,因此,這個(gè)LAMBDA函數(shù)變成了: LAMBDA(a, a+10) 這個(gè)函數(shù)是需要輸入?yún)?shù)的,比如: LAMBDA(a, a+10)(5) 結(jié)果就是15。 綜合上面的過程,TESTFUNC應(yīng)該用如下形式調(diào)用: =TESTFUNC(10)(5) 其中第一個(gè)括號(hào)內(nèi)是外層LAMBDA函數(shù)的參數(shù),第二個(gè)括號(hào)中是內(nèi)層LAMBDA函數(shù)的參數(shù)。 仔細(xì)想一下,就會(huì)發(fā)現(xiàn),上面的TESTFUNC完全可以用如下的代碼創(chuàng)建: TESTFUNC1 = LAMBDA(x, a, a + x) 從計(jì)算邏輯上來說,二者完全等價(jià)。只是調(diào)用方式不同。TESTFUNC1用普通的方式調(diào)用即可: =TESTFUNC1(10, 5) 那么我們?yōu)槭裁催€有使用嵌套的形式呢? 實(shí)際上,大部分場(chǎng)景中,我們都不建議寫成嵌套的調(diào)用,尤其是多層嵌套。不過,在某些場(chǎng)景中,這么做可以得到一些好處。 其實(shí),大部分好處都是“語義”上的。 比如,Excel中有一個(gè)TEXTSPLIT函數(shù),是通過分隔符對(duì)文本進(jìn)行拆分,假設(shè)你遇到這樣一個(gè)公式: =TEXTSPLIT(A3, B3) 如果你不是對(duì)這個(gè)函數(shù)非常熟悉的話,你一定很困惑A3和B3哪一個(gè)是要拆分的文本,哪一個(gè)是分隔符。 但是,假如有這樣一個(gè)公式: =TEXTSPLITBY(B3(A3) 注意,這里的函數(shù)的第一部分是: TEXTSPLITBY(B3) 完全可以翻譯成“根據(jù)B3拆分文本”, 那么整個(gè)公式就是: “根據(jù)B3拆分文本:A3” 這樣的公式調(diào)用可讀性更強(qiáng),可維護(hù)性也更好一些。尤其是數(shù)據(jù)處理邏輯比較復(fù)雜的時(shí)候。 實(shí)際上,我們就是將這個(gè)處理邏輯中的參數(shù)分為兩部分: 一組是需要直接進(jìn)行處理的數(shù)據(jù),另外一組是處理過程中的參數(shù)。 下面的例子中,我們創(chuàng)建了一個(gè)公式,可以根據(jù)需要使用不同的統(tǒng)計(jì)方式: STATISTICSFOR = LAMBDA(type, LAMBDA(data, SWITCH( type, "sum", SUM(data), "count", COUNT(data), "average", AVERAGE(data), "median", MEDIAN(data), "max", MAX(data), "min", MIN(data) ) ) ); 下面是這個(gè)函數(shù)的調(diào)用實(shí)例: =STATISTICSFOR("SUM")(A1:A10)=STATISTICSFOR("average")(A1:A10) 很明顯,分別是對(duì)A1:A10區(qū)域的求和和求平均值。 這個(gè)功能經(jīng)常和其他自定義函數(shù)結(jié)合在一起使用: ADDONE = LAMBDA(a, a + 1); ADDTWO = LAMBDA(a, a + 2); MYFUNCTION = LAMBDA(fn, LAMBDA(data, fn(data))); 其中, ADDONE,ADDTWO是兩個(gè)自定義函數(shù),代表了不同的計(jì)算邏輯。 MYFUNCTION則根據(jù)選擇的不同函數(shù),實(shí)現(xiàn)不同的計(jì)算邏輯: =MYFUNCTION(ADDONE)(A1:A10) 詳細(xì)解釋請(qǐng)看視頻 |
|