iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 16
0

先前學到了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函式產生的物件,本質上並無不同,以下可以看一下比較:
https://ithelp.ithome.com.tw/upload/images/20181031/201120786bcnOAw4m1.png
這樣看來,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]))

能在對的地方用對的方法,就能發揮最大效益喔~/images/emoticon/emoticon12.gif

參考資料

  • 書名-Python程式設計入門 /葉難-編著
  • 書名-輕鬆學Python3 /孫宏明-編著

上一篇
Day15-函式間的資料聯繫
下一篇
Day17-模組
系列文
Python 30天學習日誌30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言