先前學到了def述句能同時建立型別為函式的物件,並且指派名稱。除此之外,Python還提供了「Lambda函式」,它算一種無名函式(anonymous function),內容不能含有述句,只能有一則運算式。因為Python設計原則就是追求簡潔,像以前學的單行if判斷跟單行for迴圈,都是為了要縮短程式碼,所以才發展出Lambda函式。
以下為Lambda函式的語法:
lambda 參數1, 參數2...:運算式A if 關係運算式 else 運算式B
用例子來看比較清楚
f = lambda num1, num2: num1 if num1 > num2 else num2 #建立lambda
>>> f(5,9) #呼叫
9
>>> f(num2=-9,num1=-5) #用名稱對應
-5
>>> (lambda x:x**2)(4) #建立後立刻呼叫
16
>>> lambda x:return x #錯誤!不能述句呦
其實基本上就是參數去對應一下,之後會開始跑Lambda函式冒號後面的程式碼。那麼def述句與Lambda函式產生的物件,本質上並無不同,以下可以看一下比較:
這樣看來,lambda的能力比def弱很多,不過lambda特點在於無名函式,且是個運算式,只要程式能放上運算式的地方,就能放上lambda。所以拿一個排序的例子,就能清楚明白了。
list = [('apple', 25), ('orange', 10), ('fig', 12), ('apricot', 20)]
#用def來定義
def by_name(item):
return item[0]
def by_name_len(item):
return len(item[0])
def by_price(item):
return item[1]
print(sorted(list, key=by_name)) #關鍵字參數key指定
print(sorted(list, key=by_name_len))
print(sorted(list, key=by_price))
結果為
[('apple', 25), ('apricot', 20), ('fig', 12), ('orange', 10)]
[('fig', 12), ('apple', 25), ('orange', 10), ('apricot', 20)]
[('orange', 10), ('fig', 12), ('apricot', 20), ('apple', 25)]
那麼我們不用def定義,在sorted呼叫時加上lambda,改寫為下,也能有同樣結果喔!
list = [('apple', 25), ('orange', 10), ('fig', 12), ('apricot', 20)]
print(sorted(list, key=lambda item: item[0]))
print(sorted(list, key=lambda item: len(item[0])))
print(sorted(list, key=lambda item: item[1]))
能在對的地方用對的方法,就能發揮最大效益喔~