1. 程式人生 > >python學習--使用 lambda 函式

python學習--使用 lambda 函式

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'
1 這是一個多行字串,通過使用轉義字元的定義代替了三重引號\n 是一個回車,\t 是一個製表符。
2 不帶引數的 split 按照空白進行分割。所以三個空格、一個回車和一個製表符都是一樣的。
3 通過 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 函式提供確切的 (唯一的) 你想要的。這種方式更為高效、更為優雅,而且很少引起那些令人討厭 (哦,想到那些引數就頭昏) 的錯誤。