1. 程式人生 > >python中lambda講解

python中lambda講解

lambda是Python程式語言中使用頻率較高的一個關鍵字。那麼,什麼是lambda?它有哪些用法?


這裡,我們通過閱讀各方資料,總結了關於Python中的lambda的“一個語法,三個特性,四個用法,一個爭論”。


一個語法

在Python中,lambda的語法是唯一的。其形式如下:

 lambda argument_list: expression

其中,lambda是Python預留的關鍵字,argument_list和expression由使用者自定義。具體介紹如下。

    這裡的argument_list是引數列表。它的結構與Python中函式(function)的引數列表是一樣的。具體來說,argument_list可以有非常多的形式。例如:

        a, b

        a=1, b=2

         *args

         **kwargs

         a, b=1, *args

         空

        ......


這裡的expression是一個關於引數的表示式。表示式中出現的引數需要在argument_list中有定義,並且表示式只能是單行的。以下都是合法的表示式:

       1

        None

        a + b

        sum(a)

        1 if a >10 else 0

        ......


這裡的lambda argument_list: expression表示的是一個函式。這個函式叫做lambda函式。


三個特性

lambda函式有如下特性:

    lambda函式是匿名的:所謂匿名函式,通俗地說就是沒有名字的函式。lambda函式沒有名字。

    lambda函式有輸入和輸出:輸入是傳入到引數列表argument_list的值,輸出是根據表示式expression計算得到的值。

    lambda函式一般功能簡單:單行expression決定了lambda函式不可能完成複雜的邏輯,只能完成非常簡單的功能。由於其實現的功能一目瞭然,甚至不需要專門的名字來說明。

下面是一些lambda函式示例:

    lambda x, y: x*y;函式輸入是x和y,輸出是它們的積x*y

    lambda:None;函式沒有輸入引數,輸出是None

    lambda *args: sum(args); 輸入是任意個數的引數,輸出是它們的和(隱性要求是輸入引數必須能夠進行加法運算)

    lambda **kwargs: 1;輸入是任意鍵值對引數,輸出是1


四個用法


由於lambda語法是固定的,其本質上只有一種用法,那就是定義一個lambda函式。在實際中,根據這個lambda函式應用場景的不同,可以將lambda函式的用法擴充套件為以下幾種:

    將lambda函式賦值給一個變數,通過這個變數間接呼叫該lambda函式。

    例如,執行語句add=lambda x, y: x+y,定義了加法函式lambda x, y: x+y,並將其賦值給變數add,這樣變數add便成為具有加法功能的函式。例如,執行add(1,2),輸出為3。

將lambda函式賦值給其他函式,從而將其他函式用該lambda函式替換。

例如,為了把標準庫time中的函式sleep的功能遮蔽(Mock),我們可以在程式初始化時呼叫:time.sleep=lambda x:None。這樣,在後續程式碼中呼叫time庫的sleep函式將不會執行原有的功能。例如,執行time.sleep(3)時,程式不會休眠3秒鐘,而是什麼都不做。

將lambda函式作為其他函式的返回值,返回給呼叫者。

函式的返回值也可以是函式。例如return lambda x, y: x+y返回一個加法函式。這時,lambda函式實際上是定義在某個函式內部的函式,稱之為巢狀函式,或者內部函式。對應的,將包含巢狀函式的函式稱之為外部函式。內部函式能夠訪問外部函式的區域性變數,這個特性是閉包(Closure)程式設計的基礎,在這裡我們不展開。

將lambda函式作為引數傳遞給其他函式。

部分Python內建函式接收函式作為引數。典型的此類內建函式有這些。

    filter函式。此時lambda函式用於指定過濾列表元素的條件。例如filter(lambda x: x % 3 == 0, [1, 2, 3])指定將列表[1,2,3]中能夠被3整除的元素過濾出來,其結果是[3]。

    sorted函式。此時lambda函式用於指定對列表中所有元素進行排序的準則。例如sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))將列表[1, 2, 3, 4, 5, 6, 7, 8, 9]按照元素與5距離從小到大進行排序,其結果是[5, 4, 6, 3, 7, 2, 8, 1, 9]。

    map函式。此時lambda函式用於指定對列表中每一個元素的共同操作。例如map(lambda x: x+1, [1, 2,3])將列表[1, 2, 3]中的元素分別加1,其結果[2, 3, 4]。

    reduce函式。此時lambda函式用於指定列表中兩兩相鄰元素的結合條件。例如reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])將列表 [1, 2, 3, 4, 5, 6, 7, 8, 9]中的元素從左往右兩兩以逗號分隔的字元的形式依次結合起來,其結果是'1, 2, 3, 4, 5, 6, 7, 8, 9'。

另外,部分Python庫函式也接收函式作為引數,例如gevent的spawn函式。此時,lambda函式也能夠作為引數傳入。

 

一個爭議


事實上,關於lambda在Python社群是存在爭議的。Python程式設計師對於到底要不要使用lambda意見不一致。

    支援方認為使用lambda編寫的程式碼更緊湊,更“pythonic”。

    反對方認為,lambda函式能夠支援的功能十分有限,其不支援多分支程式if...elif...else...和異常處理程式try ...except...。並且,lambda函式的功能被隱藏,對於編寫程式碼之外的人員來說,理解lambda程式碼需要耗費一定的理解成本。他們認為,使用for迴圈等來替代lambda是一種更加直白的編碼風格。


原文:https://blog.csdn.net/zjuxsl/article/details/79437563