Lambda(InlineAnonymous) 函式

lambda 關鍵字建立包含單個表示式的行內函數。此表示式的值是函式在呼叫時返回的值。

考慮功能:

def greeting():
    return "Hello"

當被稱為:

print(greeting())

列印:

Hello

這可以寫成 lambda 函式,如下所示:

greet_me = lambda: "Hello"

請參閱本節底部關於將 lambdas 賦值給變數的註釋。一般來說,不要這樣做。

這將建立一個名為 greet_me 的行內函數,該函式返回 Hello。請注意,在使用 lambda 建立函式時,不要編寫 return:之後的值會自動返回。

一旦分配給變數,它就像常規函式一樣使用:

print(greet_me())

列印:

Hello

lambdas 也可以引數:

strip_and_upper_case = lambda s: s.strip().upper()

strip_and_upper_case("  Hello   ")

返回字串:

HELLO

它們也可以使用任意數量的引數/關鍵字引數,就像普通函式一樣。

greeting = lambda x, *args, **kwargs: print(x, args, kwargs)
greeting('hello', 'world', world='world')

列印:

hello ('world',) {'world': 'world'}

lambdas 通常用於短函式,這些函式便於在呼叫它們時定義(通常使用 sortedfiltermap)。

例如,這一行對一個字串列表進行排序,忽略它們的大小寫並忽略開頭和結尾處的空格:

sorted( [" foo ", "    bAR", "BaZ    "], key=lambda s: s.strip().upper())
# Out:
# ['    bAR', 'BaZ    ', ' foo ']

排序列表只是忽略空格:

sorted( [" foo ", "    bAR", "BaZ    "], key=lambda s: s.strip())
# Out:
# ['BaZ    ', '    bAR', ' foo ']

map 的例子:

sorted( map( lambda s: s.strip().upper(), [" foo ", "    bAR", "BaZ    "]))
# Out:
# ['BAR', 'BAZ', 'FOO']

sorted( map( lambda s: s.strip(), [" foo ", "    bAR", "BaZ    "]))
# Out:
# ['BaZ', 'bAR', 'foo']

數字列表的示例:

my_list = [3, -4, -2, 5, 1, 7]
sorted( my_list, key=lambda x: abs(x))
# Out:
# [1, -2, 3, -4, 5, 7]

list( filter( lambda x: x>0, my_list))
# Out:
# [3, 5, 1, 7]

list( map( lambda x: abs(x), my_list))
# Out:
[3, 4, 2, 5, 1, 7]

可以從 lambda 函式內部呼叫其他函式(帶/不帶引數)。

def foo(msg):
    print(msg)

greet = lambda x = "hello world": foo(x)
greet()

列印:

hello world

這很有用,因為 lambda 可能只包含一個表示式,並且通過使用輔助函式,可以執行多個語句。

注意

請記住, PEP-8 (官方 Python 樣式指南)不建議將 lambda 賦給變數(正如我們在前兩個示例中所做的那樣):

始終使用 def 語句而不是將 lambda 表示式直接繫結到識別符號的賦值語句。

是:

def `f(x)`: return 2*x

沒有:

f = lambda x: 2*x

第一種形式意味著生成的函式物件的名稱特別是 f 而不是通用的 <lambda>。這對於一般的回溯和字串表示更有用。賦值語句的使用消除了 lambda 表示式對顯式 def 語句提供的唯一好處(即它可以嵌入在更大的表示式中)。