我們從乙個例子引入。
這裡有乙個元素為非空字串的列表,按字串最後乙個字母將列表進行排序。如果原列表是 ['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中的匿名函式
匿名函式的定義 在python語言中除了def語句用來定義函式之外,還可以使用匿名函式lambda,它是python一種生成函式物件的表示式形式。匿名函式通常是建立了可以被呼叫的函式,它返回了函式,而並沒有將這個函式命名,普通函式需要去依靠函式名去呼叫而匿名函式沒有,所以需要把這個函式物件複製給某個...
python中的匿名函式
匿名函式 如果使用lambda 匿名 函式,map 函式和reduce 函式還能進一步簡化.lambda函式能實現普通一樣的功能,能傳入引數,也能返回運算結果 不同的是lambda函式沒有函式名,通常只有一行的表示式,函式的複雜程度也有限.匿名函式的關鍵字為 lambda 冒號前面是形參 冒號後面是...
python中的匿名函式
目錄概念 舉例1 建立乙個匿名函式 2 傳遞多個引數 3 使用if.else.語法 在定義函式的時候,不想給函式起乙個名字。這個時候就可以用lambda來定義乙個匿名函式 語法 變數名 lambda 引數 表示式 block 引數 可選,通常以逗號分隔的變數表示式形式,也就是位置引數 表示式 不能包...