【Python 進階語法 #2】lambda 與 def function 使用方法與比較整理(內含範例程式碼)

前言

python 中有個指令為「lambda」,
中文我們習慣稱呼為「匿名函數」,
當我們的函數功能很小 (例如:一行就可以寫完的那種),
不想要另外進行 def 的宣告時,
我們就可以使用 lambda 的方法完成一個快速的 function,

「lambda」 與 「def function - return」的方法是互通的,
而 lambda 的使用情境更像是為了快速實作而寫,
我們就不需要再花時間去寫 「def function - return」

比較 & 範例程式碼

一般的 「def function - return」 寫法

def add(a, b):
    return a+b

a=10
b=20
c=add(a, b)
print(c)
  • 結果

「lambda」寫法

add = lambda a, b: a+b

a=10
b=20
c=add(a, b)
print(c)
  • 結果

lambda 說明

我之前也是 lambda 學不太好的人XDD,
透過這次整理把 lambda 整個整理清楚了!

在閱讀一個 lambda function 時,先把「lambda」、「=」、「:」抓出來

例如下面的例子,
我們把「lambda」、「=」、「:」抓出來後,

剩下的大致可以分為三個部份,

  • 「=」前面的:「function name
  • 「lambda」之後緊接的:「input value
  • 「:」之後的:為「return value (output value)
add = lambda a, b: a+b

依照上面的邏輯,我們分析後可以得到:

  • 「=」前面的:「function name
    • 此處為 add
  • 「lambda」之後緊接的:「input value
    • 此處為 a, b
  • 「:」之後的:為「return value (output value)
    • 此處為 a+b
  • 這樣大家看懂了嗎XD

    對照一下正常的使用一般 「def function - return」 寫法

    def add(a, b):
        return a+b
    

    建議讀者自行練習一下,練久了自然就會懂這怎麼用了XD

    稍微變化一下用法,lambda 結合一行「if-else」

    範例程式碼

    test = lambda a, b: a-b if a>b else a+b
    
    a=10
    b=20
    
    print(test(a,b))
    print(test(b,a))
    

    執行結果

    分析

    一樣我們先把這行程式碼拆成 3 個 part:

  • 「=」前面的:「function name
    • 此處為 test
  • 「lambda」之後緊接的:「input value
    • 此處為 a, b
  • 「:」之後的:為「return value (output value)
    • 此處為 a-b if a>b else a+b
  • 而一行 「if-else」的用法:

    簡單來說就是: [if True 的結果] if [判斷式] else [else 的結果]

    所以換個寫法,我們可以知道我們這裡寫的是:

    if a>b:
        return a-b
    else
        return a+b
    

    仔細推論一下,就知道我們的輸出是正確的囉!

    • 詳細可以參考我的另外一篇文章:

    https://wongwongnotes-github-io.pages.dev/python/python_basic/python-one-line-if-else/

    稍微變化一下用法,lambda 結合一行「for-loop」

    範例程式碼

    test = lambda x: [i for i in range(x)]
    
    a = 10
    for i in test(a):
        print(i)
    

    執行結果

    你可能也會想問? 為什麼不直接 print?

    範例程式碼

    當然也是可以的!請見以下作法 (但並不推薦這樣使用)

    test = lambda x: [print(i) for i in range(x)]
    
    a = 10
    test(a)
    

    執行結果

    說明 & 不推薦這樣使用的原因

    • 不推薦的原因1:

    這邊是使用了 list 的宣告完成 for-loop 並印出值,
    但其實我們並不想要特別去宣告這個 list,
    例如下面,如果我們寫「print(test(a))」,會得到一串 None,
    實際上我覺得這會讓我們的程式邏輯看起來很怪 (雖然有達到了目的)。

    • 不推薦的原因2:

    for 本身是個 statement,「statement in list」的用法是正確的。
    但是問題就出在這個「list」,這並不是我們預期想要的東西,
    只能說他達到了我們要的目的,但多做了一些額外的事情。

    Reference

    https://www.runoob.com/python/python-functions.html
    https://stackoverflow.com/questions/23896199/python-loop-for-inside-lambda
    https://www.tutorialspoint.com/How-to-create-a-lambda-inside-a-Python-loop
    https://realpython.com/python-lambda/
    https://stackoverflow.com/questions/35238409/how-to-write-a-lambda-with-a-for-loop-in-it