橡皮擦,乙個逗趣的網際網路高階網蟲,新的系列,讓我們一起be more pythonic
。
五、lambda 表示式
滾雪球學 python 第二輪開啟,高階之路,列表與元組那些事兒
說完列表說字典,說完字典說集合,滾雪球學 python
關於 python 中的字串,我在補充兩點,滾雪球學 python
列表推導式與字典推導式,滾雪球學 python
lambda 表示式也叫做匿名函式,在定義它的時候,沒有具體的名稱,一般用來快速定義單行函式,直接看一下基本的使用:
fun =
lambda x:x+
1print
(fun(1)
)
檢視上面的**就會發現,使用 lambda 表示式定義了一行函式,沒有函式名,後面是是函式的功能,對x
進行+1
操作。
稍微整理一下語法格式:
lambda
[引數列表]
:表示式
# 英文語法格式
lambda
[arg1[
,arg2,arg3...
.argn]
]:expression
語法格式中有一些注意事項:
lambda 表示式必須使用 lambda 關鍵字定義;
lambda 關鍵字後面,冒號前面是引數列表,引數數量可以從 0 到任意。多個引數用逗號分隔,冒號右邊是 lambda 表示式的返回值。
fun =
lambda x:x+
1# 改寫為函式形式如下:
deffun
(x):
return x+
1
當然,如果你決定上述fun
也多餘,匿名函式就不該出現這些多餘的內容,你也可以寫成下面這個樣子,不過**的可讀性就變低了。
print((
lambda x:x+1)
(1))
lambda 表示式一般用於無需多次使用的函式,並且該函式使用完畢就釋放了所占用的空間。
第一點:乙個有函式名,乙個沒有函式名
第二點:lambda 表示式:
後面,只能有乙個表示式,多個會出現錯誤,也就是下面的**是不會出現的。
# 都是錯誤的
lambda x:x+
1 x+
2
由於這個原因的存在,很多人也會把 lambda 表示式稱為單表示式函式。
第三點:for 語句不能用在 lambda 中
有的地方寫成了 if 語句和 print 語句不能應用在 lambda 表示式中,該描述不準確,例如 下述**就是正確的。
lambda a:
1if a >
10else
0
基本結論就是:lambda 表示式只允許包含乙個表示式,不能包含複雜語句,該表示式的運算結果就是函式的返回值。
第四點:lambda 表示式不能共享給別的程式呼叫
第五點:lambda 表示式能作為其它資料型別的值
例如下述**,用 lambda 表示式是沒有問題的。
my_list =
[lambda a: a**2,
lambda b: b**2]
fun = my_list[0]
print
(fun(2)
)
在具體的編碼場景中,lambda 表示式常見的應用如下:
1. 將 lambda 表示式賦值給乙個變數,然後呼叫這個變數
上文涉及的寫法多是該用法。
fun =
lambda a: a**
2print
(fun(2)
)
2. 將 lambda 表達賦值給其它函式,從而替換其它函式功能
一般這種情況是為了遮蔽某些功能,例如,可以遮蔽內建sorted
函式。
sorted
=lambda
*args:
none
x =sorted([
3,2,
1])print
(x)
3. 將 lambda 表示式作為引數傳遞給其它函式
在某些函式中,函式設定中是可以接受匿名函式的,例如下述排序**:
my_list =[(
1,2)
,(3,
1),(
4,0)
,(11,
4)]my_list.sort(key=
lambda x: x[1]
)print
(my_list)
my_list
變數呼叫sort
函式,引數key
賦值了乙個 lambda 表示式,該式子表示依據列表中每個元素的第二項進行排序。
4. 將 lambda 表示式應用在 filter、map、reduce 高階函式中
這個地方先挖下乙個小坑,後續講解 filter、map、reduce 相應內容的時候,我們進行補充。
5. 將 lambda 表示式應用在函式的返回值裡面
這種技巧導致的結論就是函式的返回值也是乙個函式,具體測試**如下:
def
fun(n)
:return
lambda x:x+n
new_fun = fun(2)
print
(new_fun)
# 輸出內容:.at 0x00000000028a42f0>
上述**中,lambda 表示式實際是定義在某個函式內部的函式,稱之為巢狀函式,或者內部函式。
對應的將包含巢狀函式的函式稱之為外部函式。內部函式能夠訪問外部函式的區域性變數,這個特性是閉包(closure)程式設計的基礎,滾雪球學 python 第二輪也會有專門的一篇部落格去介紹閉包程式設計相關知識。
lambda 表示式雖然有一些有點,但是不應過度使用 lambda,最新的官方 python 風格指南 pep8 建議永遠不要編寫下述**:
normalize_case =
lambda s: s.casefold(
)
因此你想建立乙個函式並儲存到變數中, 請使用def
來定義。
不必要的封裝
我們實現乙個列表排序,按照絕對值大小進行。
my_list =[-
1,2,
0,-3
,1,1
,2,5
]sorted_list =
sorted
(my_list, key=
lambda n:
abs(n)
)print
(sorted_list)
上述貌似用到了 lambda 表示式,但是確忘記了,在 python 中所有的函式都可以當做引數傳遞。
my_list =[-
1,2,
0,-3
,1,1
,2,5
]sorted_list =
sorted
(my_list, key=
abs)
print
(sorted_list)
也就是當我們有乙個滿足要求的函式的時候,沒有必要在額外的去使用 lambda 表示式了。
更多的內容,橡皮擦也發現了一篇不錯的部落格,你可以專門的去閱讀學習一下:參考位址
lambda 表示式並不會帶來程式執行效率的提高,只會使**更簡潔。
lambda 表示式是為了減少單行函式的定義而存在的。
python 爬蟲 100 例教程,超棒的爬蟲教程,立即訂閱吧
python 爬蟲小課,精彩 9 講
小甲魚學python之序列
1.序列 列表 元組 字串共同點 利用索引得到值 索引從0開始 通過分片的方式得到元素的集合 很多共同的操作符 list a 把字串轉換為list tuple 把可迭代物件轉換為元組 max 返回集合 序列中的最大值,比較的是ascii碼的值 list reversed list1 reversed...
小白學python之使用 slots
本文以廖雪峰的官方 為參考來學習python的。其學習鏈結為廖雪峰小白學python教程。本文是學習到python的例項屬性和類屬性。參考鏈結廖雪峰python使用 slot 嘗試給例項繫結乙個屬性 class student object pass s student s.name michael...
小白學Python 之函式 二
定義乙個函式 defgetname name print 請叫我 format name return def getitem k b 0 for i in k b b i print b returnb 呼叫getname 小王 k 1,2,34,5,3,56,45,6,56,767,98 get...