Python匿名函式(lambda函式)

2021-08-22 00:03:36 字數 2110 閱讀 3012

python使用lambda關鍵字創造匿名函式。所謂匿名,意即不再使用def語句這樣標準的形式定義乙個函式。這種語句的目的是由於效能的原因,在呼叫時繞過函式的棧分配。其語法是:

lambda [arg1[, arg2, ... argn]]: expression
其中,引數是可選的,如果使用引數的話,引數通常也會在表示式之中出現。

下面舉例來說明lambda語句的使用方法(無引數)。

# 使用def定義函式的方法

deftrue

():return

true

#等價的lambda表示式

>>>

lambda :true

lambda> at 0x0000000001e42518>

# 保留lambda物件到變數中,以便隨時呼叫

>>> true = lambda :true

>>> true()

true

下面再舉乙個帶引數的例子。

# 使用def定義的函式

defadd

( x, y ):

return x + y

# 使用lambda的表示式

lambda x, y: x + y

# lambda也允許有預設值和使用變長引數

lambda x, y = 2: x + y

lambda *z: z

# 呼叫lambda函式

>>> a = lambda x, y: x + y

>>> a( 1, 3 )

4>>> b = lambda x, y = 2: x + y

>>> b( 1 )

3>>> b( 1, 3 )

4>>> c = lambda *z: z

>>> c( 10, 'test')

(10, 'test')

但由於lambda表示式特殊的設計,在特定的場景中也帶來了一些不同的體驗。

另外,lambda表示式是可以巢狀的

>>> action = (lambda x : (lambda y : x + y))

>>> a = action(10)

>>> a(5)

15

這就是乙個用lambda實現的閉包,與普通閉包一樣,內嵌lambda表示式可以獲得上層lambda函式的變數。

匿名函式的使用

匿名函式通常被用作高階函式(higher-order function,引數為函式的函式)的引數。比如,幾個內建函式:filter(),map(),reduce()。下面我們分別看看這幾個函式的用法及達到相同效果的python另一種特徵的用法

filter函式

>>> result = filter(lambda x: x%2==0, list)

>>> result

[2]>>> result = [x for x in

list

if x%2==0]

>>> result

[2]

map函式

>>> result

[2, 4, 6]

>>> result = [x*2

for x in

list]

>>> result

[2, 4, 6]

reduce函式

>>> result

6>>> result = sum(list)

>>> result

6除reduce函式的替代用法比較特殊外,map和filter函式都可以使用列表推導式(list comprehension)代替。據說,當年lambda是乙個lisp程式設計師給python加的,而guido是強烈反對的,他中意的是列表推導式。

跳轉表(jump table)

lambda的另一種用法是用來編寫跳轉表,也就是行為列表或字典,能按需執行特定的動作。

>>> key = "get"

>>> [key]()

8

這樣在字典中,每個lambda都留下了乙個後續可以呼叫的函式,通過索引可以取出來,並呼叫。這就使字段可以成為更加通用的多路分支工具。

python基礎教程之匿名函式lambda

python lambda 當我們在使用函式時,有時候,並不需要顯示的定義乙個函式,我們可以使用匿名函式更加方便,程式設計客棧在python中對匿名函式也提供了支援。比如當我們想計算兩個數a,b之和時,即f a,b a b。我們可以有兩種方法完成,第一種就是顯示的定義乙個函式f x,y 然後將引數傳...

內建函式filter 和匿名函式lambda解析

一.內建函式filter filter 函式是 python 內建的乙個高階函式,filter 函式接收乙個函式 f 和乙個list,這個函式 f 的作用是對每個元素進行判斷,返回由符合條件迭代器 python3以下版本返回是列表 語法 filter function or none,iterabl...

Python基礎刻意練習 函式與lambda表示式

本系列定位為複習筆記,某些內容並未提及。在此記錄一些典型疑問和我在學習中的問題或經常遺忘的細節,也會新增一些覺得有意思的部分 其實就是隨心所欲 內容主要使用 進行傳達 def printme str print str printme 1 printme 2 temp printme hello p...