最近學習了Python中的 lambda 表達式,用來創建匿名函數,覺得這個小玩意也是有非常方便好用的地方。
那麼,今天來嘮嗑嘮嗑 lambda 表達式。
也是自己學習的一個覆盤哈。
正如哲學的終極命題:我是誰?我從哪裏來?我到哪裏去?
我們今天就從 什麼是 lambda?爲什麼用 lambda?怎麼用lambda? 三個方面來認識下 lambda 表達式。
一、什麼是lambda
我們常說可以用 lambda 來創建匿名函數。沒錯,本質上 lambda 表達式就是一種非常省時省力創建函數的方法。
在某些情況下,運用 lambda 表達式創建簡單的方法函數,會比用 def 定義函數寫一個代碼塊要方便簡單許多。
也確實是這樣的,那麼我正式認識一下這位新夥伴。
lambda的語法結構比較簡單:
lambda arg1 ,arg2,.....argn : expression
翻譯成中文就是:
lambda 參數1,參數2,…參數n : 表達式
簡單舉個栗子,你就明白了哈。
比如我們要寫一個簡單的求兩個數相加和的函數。
如果使用 def 來定義函數,那麼它是這樣的:
def add(a,b):
s = a+b
return s
x = add(5,6)
print(x)
如果我們使用 lambda 表達式
s = lambda a,b:a+b
x = s(5,6)
print(x)
是不是形式上看上去簡單了許多?
二、爲什麼用lambda
那麼具體來說使用 lambda 表達式有什麼好處?
總的歸納一下,那就是三大懶人福音:
- 可以精簡代碼。在寫一些執行腳本時候,針對那些使用的不太多的函數,就不需要用 def 定義了。(懶人福音1)
- 增強代碼可讀性。你在閱讀代碼的時候,就不用回到開頭看def如何定義函數的,可以通過 lambda 直接看。 (懶人福音2)
- 忘卻函數命名煩惱。嗯,沒錯,用 lambda 表達式,你可以不像 def 定義函數那樣去思考一個合適且讓人易懂的函數名稱。(懶人福音3)
三、怎麼用lambda
其實我們在第一部分介紹 lambda 表達式的時候已經介紹了其使用方法。
但是這裏我們要結合第二部分中提到的 lambda 的優勢好處,來舉例適合在哪些場合下使用 lambda。
1. filter() 與 lambda
通過filter()函數,讓你看看使用 lambda 會有多麼的方便
首先了解下 filter()函數
filter() 函數用於過濾序列,過濾掉不符合條件的元素,返回一個迭代器對象,如果要轉換爲列表,可以使用 list() 來轉換。
filter() 可以接收兩個參數,第一個爲函數,第二個爲序列,序列的每個元素作爲參數傳遞給函數進行判,然後返回 True 或
False,最後將返回 True 的元素放到新列表中。
舉個栗子:
篩選並生成出20以內的偶數的列表
def even(a):
return a % 2 - 1
# 如果a是奇數,則a%2-1=0,返回False;
# 如果a是偶數,則a%2-1=-1,返回True;
even_number = filter(even, range(21))
print('使用 def 定義函數:')
print(list(even_number))
print('\n')
print('使用 lambda 表達式:')
print(list(filter(lambda a:a%2-1, range(21))))
運用程序:
- 實現以上功能,如果 def 定義函數,你再怎麼也要先定義一個函數塊,然後寫主程序代碼;而使用 lambda 表達式,我們一行代碼就搞定了!(當然看着就相對冗長了點)
- 就像我們所說的,使用 def 定義函數,你閱讀主程序代碼,你還得回頭看def裏面的內容;而使用 lambda,你可以直接一行閱讀過去就能懂了
——
2. Canvas 與 lambda
關於這個案例,如果你想知道整個的來龍去脈。請點擊下面鏈接跳轉【tkinter組件專欄】Canvas:發揮你橫溢才華的畫布
點擊目錄,快速定位到 【Canvas 自由塗鴉】部分內容
我們要在畫布上創建一個可以刪除所有元素的按鈕。
因爲這個功能也可能就用這麼一次,如果單獨去定義一個功能函數,也顯得稍微麻煩。
所以這種場合下,lambda 表達式就充分發揮它的作用了。
tk.Button(root, text="清除屏幕", command=(lambda a='all':w.delete(a))).pack(padx=10,pady=10)
一個小小的 lambda a='all':w.delete(a)
,我們就實現了清除屏幕功能。
是不是還是炒雞方便!
四、覆盤總結
- 語法結構:
lambda arg1 ,arg2,.....argn : expression
- 使用 lambda 的好處:①可以簡化代碼;②增加代碼可讀性;③忘卻函數命名煩惱
- 使用場景舉例:①filter() 函數與 lambda;②Canvas 與 lambda