python lambda函式 與 函式式程式設計

2021-07-15 10:36:42 字數 1950 閱讀 2865

lambda函式又名匿名函式。顧名思義,匿名函式,那肯定就是沒有函式名稱啦。先看個最簡單的例子:

先寫個正常的函式:

def f(x):

return x+1

很簡單,不解釋。如果寫成lambda函式:

g = lambda x:x+1

print g

print g(2)

at 0x1007cc668>

3

由此可見g確實是個函式物件。lambda函式都是以lambda開頭,後面接引數,引數後面再接冒號,冒號後面則是函式返回的具體內容。

當然也可以在lambda函式中指定多個引數:

f = lambda x,y:x+y+1

print "the result is: ", f(2,3)

the result is:  6
很多人說,lambda函式只是省略了函式名而已。而且這樣的匿名函式,又不能在別的地方被呼叫,那幹嘛還要使用lambda函式呢?

乙個東西既然存在,肯定有他存在的合理性與必然性。根據我的使用感受來看,使用lambda函式主要有以下優點:

1.省略了函式名。什麼,這不是優點?拜託,請問寫**最難的部分是什麼?之前github上做過類似調查,結果"給變數/函式命名"的選項遙遙領先!給變數/函式取個短小精悍容易理解又能正確反應其含義的名字是件很困難的事情好不好!尤其是那些只呼叫一次的函式,給它起個靠譜的名字,真的是太困難了。lambda函式正好就派上了用場。

2.在有些場合,省略了函式定義的過程,**更加簡潔而且容易理解。

總結起來看的話,lambda函式更多起的是潤滑劑或者語法糖的作用,讓使用者更為方便。在很多場合,lambda函式也可以用其他方式實現,但那樣可能會付出**更為複雜的代價。

map函式的官方定義如下:

ret_list = map(lambda x:x+1,[1,2,3])

print "ret_list is: ",ret_list

ret_list is:  [2, 3, 4]
上面的例子中,map函式有兩個引數,乙個lambda方法,lambda方法返回的是x+1;另外的引數是乙個列表,map函式做的事,就是對列表項中的每個數字進行加1的操作,最後返回乙個列表。

當然,上面例子中map函式中的lambda方法,可以使用列表解析的方式來實現。

print [x+1 for x in range(1,4)]
這樣寫,更簡潔明瞭。對於一般人而言,也比lambda更容易理解。另外,列表解析的速度也很快,是非常pythonic的寫法。

有如下的**:

fs = [ lambda n: i+n for i in range(5) ]

for k in range(5):

print "fs[%d]: " %k,fs[k](4)

此時的輸出為:

fs[0]:  8

fs[1]: 8

fs[2]: 8

fs[3]: 8

fs[4]: 8

怪哉。咋不符合預期勒。其實問題就出在變數i上面。因為lambda函式中沒有指定引數i,所以這時輸入的i為全域性變數!

這麼寫就ok了:

fl = [ (lambda n,i=i: i+n) for i in range(5)]

for k in range(5):

print "fl[%d]: " %k,fl[k](4)

fl[0]:  4

fl[1]: 5

fl[2]: 6

fl[3]: 7

fl[4]: 8

Python lambda與內建函式

對於簡單的函式,也存在一種簡便的表示方式,即 lambda表示式 普通函式 def func a return a 1 print test1 func0 func 1000 lambda表示式 func0 lambda a a 1 print test2 func0 func0 1000 上面這種...

python lambda函式基礎

本文,我們學習python lambda函式。首先,看一下python lambda函式的語法,如下 f lambda parameter1,parameter2,expression lambda語句中,冒號前是引數,可以有0個或多個,用逗號隔開,冒號右邊是返回值。lambda語句構建的其實是乙個...

python lambda匿名函式

lambda定義乙個匿名函式 lambda只是乙個表示式,函式體比def簡單很多,很多時候定義def,然後寫乙個函式太麻煩,這時候就可以用lambda定義乙個匿名函式。lambda的主體是乙個表示式,而不是乙個 塊。僅僅能在lambda表示式中封裝有限的邏輯進去。參考鏈結 lambda的特性 乙個語...