1. 程式人生 > >Python 中的匿名函式,你濫用了嗎?

Python 中的匿名函式,你濫用了嗎?

概念

我們從一個例子引入。

這裡有一個元素為非空字串的列表,按字串最後一個字母將列表進行排序。如果原列表是 ['abc', 'g', 'def'],則結果應該是 ['abc', 'def', 'g']。

很容易得到如下程式碼

Python 中的匿名函式,你濫用了嗎?

我們發現, get_last_element 這個方法比較簡單,並且只用了一次,但必須定義後得到一個名稱才能使用。在上面的情境中,使用起來稍微麻煩了點,我們能不能直接定義了就用呢?當然可以。

Python 中的匿名函式,你濫用了嗎?

使用很簡單,有如下幾個關鍵點

使用 lambda 關鍵字
自動 return,不需要你自己寫
只有一行程式碼

知道了上面的內容,匿名函式的概念也大致清晰了。

使用誤區

知道了匿名函式後,我們在開發的時候有時候不經意就把這個東西濫用了。

1 .給匿名函式命名

PEP 8 中建議我們不要寫類似下面的程式碼

Python 中的匿名函式,你濫用了嗎?

匿名函式可以直接當做變數一樣傳遞,比如傳給函式作為引數,並不要求它一定有個名字。

需要注意的是,其實上面的操作並沒有真正起到給函式命名的作用。

如果需要給定義的函式命名,使用 def 關鍵字即可

Python 中的匿名函式,你濫用了嗎?

通過 def 定義的函式才是真正有名稱的,匿名函式的名稱永遠是 lambda

Python 中的匿名函式,你濫用了嗎?

2. 沒有必要的匿名函式

某些時候,我們沒有使用匿名函式的必要,但卻無意中使用了。

一般有兩種情況。一是使用無意義的呼叫,比如下面的程式碼

Python 中的匿名函式,你濫用了嗎?

將列表按元素的長度進行排序。

其實,我們可以直接這樣

Python 中的匿名函式,你濫用了嗎?

上面的一提出來大家馬上就理解了,但是平時我們卻或多或少的犯了類似的毛病。

另一方面,有很多函式,標準庫中都已經實現了,我們不知道,所以做了多餘的事情。

比如這裡

Python 中的匿名函式,你濫用了嗎?

這裡的匿名函式可以直接用 mul 函式替換

Python 中的匿名函式,你濫用了嗎?

Python 的 operator 模組提供了很多常用的操作,熟悉了後,你會慢慢喜歡上它的。裡面除了算術、比較等操作,關於對字典、物件的操作也值得一提。

itemgetter 函式,根據鍵獲取字典的值

Python 中的匿名函式,你濫用了嗎?

attrgetter 函式,根據屬性獲取對應值

Python 中的匿名函式,你濫用了嗎?

3. 降低可讀性的匿名函式

按元素的長度和字典序對列表進行排序

Python 中的匿名函式,你濫用了嗎?

上面的程式碼能夠實現功能,但是我覺得下面的可讀性更強一些

Python 中的匿名函式,你濫用了嗎?

我們通過函式函式名就大概知道了函式的作用,如果是匿名函式的話,我們還得去看相應的邏輯。

4. 可能根本不需要傳遞函式

對一個列表進行求和,我們可能會看到這樣的程式碼

Python 中的匿名函式,你濫用了嗎?

其實,直接使用 sum 函式就行了

Python 中的匿名函式,你濫用了嗎?

對於一些特定的需求,很多時候 Python 可能已經有了現成的方案。我們要有這方面的意識,儘可能簡單的去解決問題。

5. 可以不使用 map/filter

Python 中的 map 和 filter 一般都結合匿名函式在使用,前者是在迭代過程中對元素做一些處理,後者是過濾掉一些元素。很多情況下,我們可以使用列表推導式或者生成器表示式代替它們。

用生成器表示式代替 map

Python 中的匿名函式,你濫用了嗎?

用生成器表示式代替 filter

Python 中的匿名函式,你濫用了嗎?

明顯的可以看出,使用生成器表示式的程式碼可讀性更強一些。

什麼時候使用匿名函式

說了這麼多匿名函式使用的誤區,那麼什麼時候使用比較合理呢?我覺得滿足下面的幾個點,就可以考慮考慮了。

只用一次
函式邏輯簡單
使用匿名函式前儘可能的確定 Python 沒有自帶類似功能的函式

原文連結:
https://blog.csdn.net/sinat_38682860/article/details/83867671


 

Python 中的匿名函式,你濫用了嗎?

識別圖中二維碼,領取python全套視訊資料