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

概念

咱們從一個例子引入。java

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

很容易獲得以下代碼函數

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

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

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

使用很簡單,有以下幾個關鍵點視頻

使用 lambda 關鍵字
自動 return,不須要你本身寫
只有一行代碼

知道了上面的內容,匿名函數的概念也大體清晰了。對象

使用誤區

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

1 .給匿名函數命名

PEP 8 中建議咱們不要寫相似下面的代碼排序

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

匿名函數能夠直接當作變量同樣傳遞,好比傳給函數做爲參數,並不要求它必定有個名字。element

須要注意的是,其實上面的操做並無真正起到給函數命名的做用。開發

若是須要給定義的函數命名,使用 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全套視頻資料

相關文章
相關標籤/搜索