Python 使用 lambda 函式

2021-06-15 07:37:50 字數 2030 閱讀 2175

python 支援一種有趣的語法,它允許你快速定義單行的最小函式。這些叫做 lambda 的函式,是從 lisp 借用來的,可以用在任何需要函式的地方。

1. lambda 函式介紹

>>> def f(x):

... return x*2

...

>>> f(3)

6>>> g = lambda x: x*2 (1)

>>> g(3)

6>>> (lambda x: x*2)(3) (2)

6

(1)  這是乙個 lambda 函式,完成同上面普通函式相同的事情。注意這裡的簡短的語法:在引數列表周圍沒有括號,而且忽略了 return 關鍵字 (隱含存在,因為整個函式只有一行)。而且,該函式沒有函式名稱,但是可以將它賦值給乙個變數進行呼叫。

(2)  使用 lambda 函式時甚至不需要將它賦值給乙個變數。這可能不是世上最有用的東西,它只是展示了 lambda 函式只是乙個內聯函式。

總的來說,lambda 函式可以接收任意多個引數 (包括可選引數) 並且返回單個表示式的值。lambda 函式不能包含命令,包含的表示式不能超過乙個。不要試圖向 lambda 函式中塞入太多的東西;如果你需要更複雜的東西,應該定義乙個普通函式,然後想讓它多長就多長。

2. 真實世界中的  lambda  函式

apihelper.py 中的 lambda 函式:

processfunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)

注意這裡使用了 and-or 技巧的簡單形式,它是沒問題的,因為 lambda 函式在布林環境中總是為真。(這並不意味這 lambda 函式不能返回假值。這個函式物件的布林值為真;它的返回值可以是任何東西。)

還要注意的是使用了沒有引數的 split 函式。你已經看到過它帶乙個或者兩個引數的使用,但是不帶引數它按空白進行分割。

3. spl it  不帶引數

>>> s = "this   is\na\ttest"  (1)

>>> print s

this is

a test

>>> print s.split() (2)

['this', 'is', 'a', 'test']

>>> print " ".join(s.split()) (3)

'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 函式提供確切的 (唯一的) 你想要的。這種方式更為高效、更為優雅,而且很少引起那些令人討厭 (哦,想到那些引數就頭昏) 的錯誤。

python的map函式和lambda函式

map函式的功能是根據提供的函式對指定序列做對映,就是對第二個引數的每乙個值執行第乙個引數所指定的函式 lambda是定義乙個匿名函式 crsusr rws1270149 python study cat mypy02.py usr bin python3.7 import sys,string,o...

Python中lambda的使用

這部分還是從簡單的例子開始入手吧!f lambda x,y x y f 3,5 f at 0x000001d7e26d6400 從上面的結果可以看出,lambda實現的功能物件f其實是乙個函式,這種該函式成為匿名函式。在冒號前面的部分是函式的引數,冒號後面的內容可以理解為函式體。這樣,lambda表...

python中lambda的使用

lambda表示式 匿名函式 lambda 表示式 lambda expression 是乙個匿名函式,lambda表示式基於數學中的 演算得名,直接對應於其中的lambda抽象 lambda abstraction 是乙個匿名函式,即沒有函式名的函式 lambda在python中的應用 lambd...