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