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