滾雪球學 Python 之 lambda 表示式

2021-10-21 02:40:35 字數 4266 閱讀 3106

橡皮擦,乙個逗趣的網際網路高階網蟲,新的系列,讓我們一起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...