1. 程式人生 > >測開之函式進階· 第4篇《匿名函式》

測開之函式進階· 第4篇《匿名函式》

## 堅持原創輸出,點選藍字關注我吧 ![](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+原創文章**,歡迎關注、交流,禁止第三方擅自