簡單來說,程式設計中提到的 lambda 表示式,通常是在需要乙個函式,但是又不想費神去命名乙個函式的場合下使用,也就是指匿名函式。這一用法跟所謂 λ 演算(題目說明裡的維基鏈結)的關係,有點像原子彈和質能方程的關係,差別其實還是挺大的。
不談形式化的 λ 演算,只說有實際用途的匿名函式。先舉乙個普通的 python 例子:將乙個 list 裡的每個元素都平方:
map( lambda x: x*x, [y for y in range(10)] )
這個寫法要好過
def sq(x):
return x * x
map(sq, [y for y in range(10)])
,因為後者多定義了乙個(汙染環境的)函式,尤其如果這個函式只會使用一次的話。而且第一種寫法實際上更易讀,因為那個對映到列表上的函式具體是要做什麼,非常一目了然。如果你仔細觀察自己的**,會發現這種場景其實很常見:你在某處就真的只需要乙個能做一件事情的函式而已,連它叫什麼名字都無關緊要。lambda 表示式就可以用來做這件事。
進一步講,匿名函式本質上就是乙個函式,它所抽象出來的東西是一組運算。這是什麼意思呢?模擬
a = [1, 2, 3]
和
f = lambda x : x + 1
,你會發現,等號右邊的東西完全可以脫離等號左邊的東西而存在,等號左邊的名字只是右邊之實體的識別符號。如果你能習慣 [1, 2, 3] 單獨存在,那麼 lambda x : x + 1 也能單獨存在其實也就不難理解了,它的意義就是給「某個數加一」這一運算本身。
現在回頭來看 map() 函式,它可以將乙個函式對映到乙個可列舉型別上面。沿用上面給出的 a 和 f,可以寫:
map(f
,a)
也就是將函式 f 依次套用在 a 的每乙個元素上面,獲得結果 [2, 3, 4]。現在用 lambda 表示式來替換 f,就變成:
map
(lambdax:
x+1,
[1,2
,3])
會不會覺得現在很一目了然了?尤其是模擬
a=[
1,2,
3]r=
foreachina
:r.(
each+1
)
這樣的寫法時,你會發現自己如果能將「遍歷列表,給遇到的每個元素都做某種運算」的過程從乙個迴圈裡抽象出來成為乙個函式 map,然後用 lambda 表示式將這種運算作為引數傳給 map 的話,考慮事情的思維層級會高出一些來,需要顧及的細節也少了一點。python 之中,類似能用到 lambda 表示式的「高階」函式還有 reduce、filter 等等,很多語言也都有這樣的工具(不過這些特性最好不要在 python 中用太多,原因詳見 http://www.
Lambda 表示式有何用處?如何使用?
簡單來說,程式設計中提到的 lambda 表示式,通常是在需要乙個函式,但是又不想費神去命名乙個函式的場合下使用,也就是指匿名函式。這一用法跟所謂 演算 題目說明裡的維基鏈結 的關係,有點像原子彈和質能方程的關係,差別其實還是挺大的。不談形式化的 演算,只說有實際用途的匿名函式。先舉乙個普通的 py...
lambda表示式 lambda表示式
1.概述 c 11 中的 lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda 的語法形式如下 函式物件引數 操作符過載函式引數 mutable 或 exception 宣告 返回值型別可以看到,lambda 主要分為五個部分 函式物件引數 操作符過載函式引數 muta...
Lambda表示式和Lambda表示式樹
原版來自 linq學習筆記之二 lambda表示式和lambda表示式樹 lambda 表示式 lambda expressions 是linq實現的另一特性。lambda表示式的作用就是使用使用函式式語法,將方法實現關聯到委託例項。在使用查詢表示式 query expressions 時,查詢表示...