python學習--使用 lambda 函式
阿新 • • 發佈:2019-01-06
4.7.1. 真實世界中的 lambda 函式
apihelper.py 中的 lambda 函式:
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
注意這裡使用了 and-or 技巧的簡單形式,它是沒問題的,因為 lambda 函式在布林環境中總是為真。(這並不意味這 lambda 函式不能返回假值。這個函式物件的布林值為真;它的返回值可以是任何東西。)
還要注意的是使用了沒有引數的 split 函式。你已經看到過它帶一個或者兩個引數的使用,但是不帶引數它按空白進行分割。
例 4.21. split 不帶引數
>>> s = "this is\na\ttest" >>> print s this is a test >>> print s.split() ['this', 'is', 'a', 'test'] >>> print " ".join(s.split()) 'this is a test'
這是一個多行字串,通過使用轉義字元的定義代替了三重引號。\n 是一個回車,\t 是一個製表符。 | |
不帶引數的 split 按照空白進行分割。所以三個空格、一個回車和一個製表符都是一樣的。 | |
通過 split 分割字串你可以將空格統一化;然後再以單個空格作為分隔符用 join 將其重新連線起來。這也就是 info 函式將多行 doc string 合併成單行所做的事情。 |
那麼 info 函式到底用這些 lambda 函式、split 函式和 and-or 技巧做了些什麼呢?
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
processFunc 現在是一個函式,但是它到底是哪一個函式還要取決於 collapse 變數。如果 collapse 為真,processFunc (string) 將壓縮空白;否則 processFunc(string) 將返回未改變的引數。
在一個不很健壯的語言中實現它,像 Visual Basic,你很有可能要建立一個函式,接受一個字串引數和一個 collapse 引數,並使用 if 語句確定是否壓縮空白,然後再返回相應的值。這種方式是低效的,因為函式可能需要處理每一種可能的情況。每次你呼叫它,它將不得不在給出你所想要的東西之前,判斷是否要壓縮空白。在 Python 中,你可以將決策邏輯拿到函式外面,而定義一個裁減過的 lambda 函式提供確切的 (唯一的) 你想要的。這種方式更為高效、更為優雅,而且很少引起那些令人討厭 (哦,想到那些引數就頭昏) 的錯誤。