Python 中的匿名函式,你濫用了嗎?
概念
我們從一個例子引入。
這裡有一個元素為非空字串的列表,按字串最後一個字母將列表進行排序。如果原列表是 ['abc', 'g', 'def'],則結果應該是 ['abc', 'def', 'g']。
很容易得到如下程式碼
我們發現, get_last_element 這個方法比較簡單,並且只用了一次,但必須定義後得到一個名稱才能使用。在上面的情境中,使用起來稍微麻煩了點,我們能不能直接定義了就用呢?當然可以。
使用很簡單,有如下幾個關鍵點
使用 lambda 關鍵字
自動 return,不需要你自己寫
只有一行程式碼
知道了上面的內容,匿名函式的概念也大致清晰了。
使用誤區
知道了匿名函式後,我們在開發的時候有時候不經意就把這個東西濫用了。
1 .給匿名函式命名
PEP 8 中建議我們不要寫類似下面的程式碼
匿名函式可以直接當做變數一樣傳遞,比如傳給函式作為引數,並不要求它一定有個名字。
需要注意的是,其實上面的操作並沒有真正起到給函式命名的作用。
如果需要給定義的函式命名,使用 def 關鍵字即可
通過 def 定義的函式才是真正有名稱的,匿名函式的名稱永遠是 lambda
2. 沒有必要的匿名函式
某些時候,我們沒有使用匿名函式的必要,但卻無意中使用了。
一般有兩種情況。一是使用無意義的呼叫,比如下面的程式碼
將列表按元素的長度進行排序。
其實,我們可以直接這樣
上面的一提出來大家馬上就理解了,但是平時我們卻或多或少的犯了類似的毛病。
另一方面,有很多函式,標準庫中都已經實現了,我們不知道,所以做了多餘的事情。
比如這裡
這裡的匿名函式可以直接用 mul 函式替換
Python 的 operator 模組提供了很多常用的操作,熟悉了後,你會慢慢喜歡上它的。裡面除了算術、比較等操作,關於對字典、物件的操作也值得一提。
itemgetter 函式,根據鍵獲取字典的值
attrgetter 函式,根據屬性獲取對應值
3. 降低可讀性的匿名函式
按元素的長度和字典序對列表進行排序
上面的程式碼能夠實現功能,但是我覺得下面的可讀性更強一些
我們通過函式函式名就大概知道了函式的作用,如果是匿名函式的話,我們還得去看相應的邏輯。
4. 可能根本不需要傳遞函式
對一個列表進行求和,我們可能會看到這樣的程式碼
其實,直接使用 sum 函式就行了
對於一些特定的需求,很多時候 Python 可能已經有了現成的方案。我們要有這方面的意識,儘可能簡單的去解決問題。
5. 可以不使用 map/filter
Python 中的 map 和 filter 一般都結合匿名函式在使用,前者是在迭代過程中對元素做一些處理,後者是過濾掉一些元素。很多情況下,我們可以使用列表推導式或者生成器表示式代替它們。
用生成器表示式代替 map
用生成器表示式代替 filter
明顯的可以看出,使用生成器表示式的程式碼可讀性更強一些。
什麼時候使用匿名函式
說了這麼多匿名函式使用的誤區,那麼什麼時候使用比較合理呢?我覺得滿足下面的幾個點,就可以考慮考慮了。
只用一次
函式邏輯簡單
使用匿名函式前儘可能的確定 Python 沒有自帶類似功能的函式
原文連結:
https://blog.csdn.net/sinat_38682860/article/details/83867671
識別圖中二維碼,領取python全套視訊資料