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 沒有自帶類似功能的函數
總結
以上是生活随笔為你收集整理的Python 中的匿名函数,你会用吗的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我不想用for循环
- 下一篇: Python慢,为啥还有大公司用?