堅持原創輸出,點選藍字關注我吧
作者:清菡
部落格:oschina、雲+社群、知乎等各大平臺都有。
由於微信公眾號推送改為了資訊流的形式,防止走丟,請給加個星標 ⭐,你就可以第一時間接收到本公眾號的推送!
目錄
- 一、匿名函式
- 1.匿名函式格式
- 2.匿名函式適用的場景
- 3.如何呼叫 lambda 函式
- 4.運算子的優先順序
- 5.用 lambda 實現過濾
- 6.在列表推導式中怎麼用?
- 二、三目運算子
- 三、精彩推薦
一、匿名函式
Python 中有一種特殊的函式,不需要使用def
去定義,也不用給函式起名字。用lambda
表示式來定義,這種函式叫做匿名函式。
1.匿名函式格式
lambda 引數:表示式(返回值)
lambda
定義函式和def
定義函式的時候,格式是不一樣的。
這個匿名函式lambda a,b:a+b
和這個普通函式:
def func(a,b):
return a+b
效果是一樣的。
def
後面跟著函式名字func()
,lambda
後面是沒有函式名字的,直接寫引數,引數後面是個冒號。冒號後面的a+b
就是個返回值。
2.匿名函式適用的場景
簡單的函式定義(只有一個表示式)。
例如普通函式:
def func(a,b):
c = a+b
print(c)
return a+b
這個函式裡面有多條語句,這種的話就不適用於這個匿名函式lambda a,b:a+b
語句。
lambda
只有一條return
的內容。return
根據引數進行相關操作,進行返回。
3.如何呼叫 lambda 函式
錯誤方式一:
lambda a,b:a+b(11,22)
沒看到輸出結果。其實是呼叫了,只是你沒看到。呼叫完畢後,返回值需要接收一下。
這樣是呼叫不了的:
res = lambda a,b:a+b(11,22)
print(res)
列印一個 lambda
函式物件:
lambda a,b:a+b
這塊是個匿名函式,lambda a,b:a+b(11,22)
這樣寫,會把a+b(11,22)
全部當作一個表示式。
res = lambda a,b:a+b(11,22)
print(res(11,22))
這時候執行就會報錯:
報錯提示:int
物件沒有呼叫的方法。
錯誤方式二:
還有,這種寫法定義函式,也不會去用:
f=lambda a:a*9
f(10)
匿名函式講究即用即釋放,就是定義這個函式,使用完畢後,記憶體裡面就釋放這個記憶體了。
因為沒有任何變數指向這個函式,所以記憶體就馬上釋放了,可以節約記憶體。
定義完畢後:
f=lambda a:a*9
f(10)
f
就相當於一個函式名了,呼叫完畢後,再想用這個 f
, 還是可以夠得到的。那這個函式始終都存在記憶體裡面了。
正確呼叫方式:
res = lambda a,b:a+b
print(res(11,22))
4.運算子的優先順序
如果分不清哪個先用,哪個後用,可以加個括號把它擴起來:
(lambda a,b:a+b)(1,2)
res = (lambda a,b:a+b)(1,2)
print(res)
通過lambda
直接定義直接呼叫,例如(lambda a,b:a+b)(1,2)
中(lambda a,b:a+b)
呼叫完畢後,馬上從記憶體裡給刪除掉了,立馬釋放記憶體。
5.用 lambda 實現過濾
lambda
用的最多的是在 filter()
、zip()
函式。
li = [1, 2, 122, 331, 11, 22, 33, 4, 6, 7, 2, 88, 31]
res2=filter(lambda x:x<10,li)
print(list(res2))
這樣就實現了一個快速的過濾,之前還要定義一個函式,這樣寫更加節省記憶體,而且語法更加舒適:
x<10
的都保留下來,當然你也可以修改成x<33
或者其它的,具體看列表裡面的元素,設定的條件不一樣,輸出的結果就不同。
res2=filter(lambda x:x<10,li)
中過濾條件是lambda x:x<10
,後面傳可迭代物件li
。
6.在列表推導式中怎麼用?
生成 10 個數:
li2=[(lambda x:x%5==0)(i) for i in range(10)]
print(li2)
lambda x:x%5==0
這是個lambda
的表示式,需要個x
的引數,是能夠被 5 整除的意思。
二、三目運算子
a=100
if a>100:
print(100)
else:
print(22)
寫成三目運算子是這樣:
print(100) if a>100 else print(22)
三目運算子適用於條件成立的時候做什麼事情,條件不成立的時候做什麼事情。有些很簡單的條件控制,通過這種方式來做。
和lambda
一樣,可以簡化程式碼。原來需要定義這個函式,再傳進去,通過lambda
表示式也可以把函式直接寫在那行程式碼裡面了,不需要去單獨去定義函式了。lambda
表示式用得多,三目運算子用得少。
三、精彩推薦
- 資料型別第 2 篇「字典和集合的原理和應用」
- 測開之資料型別· 第 3 篇《列表推導式、字典推導式、2 種方式建立生成器》
- 測開之資料型別· 第 4 篇《迭代器、生成器》
- 測開之函式進階· 第 2 篇《純函式》
- 函式進階· 第 3 篇《常用內建函式 filter()、map()、zip(),怎麼用的呢?》
公眾號 清菡軟體測試 首發,更多原創文章:清菡軟體測試 113+原創文章,歡迎關注、交流,禁止第三方擅自轉載。