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
lambda
s 也可以引數:
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'}
lambda
s 通常用於短函式,這些函式便於在呼叫它們時定義(通常使用 sorted
,filter
和 map
)。
例如,這一行對一個字串列表進行排序,忽略它們的大小寫並忽略開頭和結尾處的空格:
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
語句提供的唯一好處(即它可以嵌入在更大的表示式中)。