Python - lambda 表示式

小菠蘿測試筆記發表於2021-08-11

Python 中的函式是第一類物件

  • 好像很多地方都會看到這樣一句話
  • Python 創始人也說過,所有的物件都是第一類物件

 

什麼是第一類物件

  • 在上面中所說的第一類物件,其實是指函式作為一個物件,與其它物件具有相同的地位
  • 具體來說,數值可以被賦值給變數、作為引數傳遞給函式、作為返回值
  • 因為函式和數值具有相同的地位,所以函式也可以被賦值給變數、作為引數傳遞給函式、作為返回值

 

將物件賦值給變數

可以將數值、字串、列表、字典型別的物件賦值給變數

number = 123
string = "hello"
list = [1, 2, 3]
dict = {'name': 'tom', 'age': 12}

 

將物件作為引數傳遞

可以將數值、字串、列表、字典型別的物件作為引數傳遞給函式

print(123)
print("hello")
print([1, 2, 3])
print({'name': 'tom', 'age': 12})

 

將物件用作返回值

可以將數值、字串、列表、字典型別的物件作為函式的返回值

def return_number():
    return 123

def return_string():
    return "hello"

def return_list():
    return [1, 2, 3]    

def return_dict():    
    return {'name': 'tom', 'age': 12}

 

將函式作為第一類物件

將函式作為第一類物件,函式具有和數值、字串、列表、字典等型別的物件具有相同的地位

 

將函式賦值給變數

def max(a, b):
    if a > b:
        return a
    else:
        return b


var = max
print(var(1, 2))


# 輸出結果
2

 

將函式作為引數傳遞

def func():
    print("function")


def pass_func(data):
    print("pass func")
    data()


pass_func(func)


# 輸出結果
pass func
function

 

將函式作為返回值

def func():
    print("function")


def return_func():
    print("pass func")
    return func


# 等價 var = func
var = return_func()
var()

 

將函式作為第一類物件的意義

將函式作為第一類物件,是一種重要的抽象機制,極大的提升了程式的靈活性

 

實戰慄子

  • 存在一個列表 [1, -1, 2, -2, 3, -3]
  • 列印輸出列表中的正數
  • 列印輸出列表中的負數

 

包含重複性程式碼的解決方法

程式碼結構完全相同,只是條件判斷不同

# 重複性程式碼解決方法
list = [1, -1, 2, -2, 3, -3]


def print_positive(list):
    for item in list:
        if item > 0:
            print(item)


def print_negative(list):
    for item in list:
        if item < 0:
            print(item)


print_positive(list)
print_negative(list)


# 輸出結果
1
2
3
-1
-2
-3

 

將函式作為引數傳遞

# 重複性程式碼解決方法
list = [1, -1, 2, -2, 3, -3]

def positive(x):
    return x > 0


def negative(x):
    return x < 0


def test(list, select_fun):
    for item in list:
        if select_fun(item):
            print(item)


test(list, positive)
test(list, negative)


# 輸出結果
1
2
3
-1
-2
-3

 

匿名函式 lambda

為什麼有 lambda 匿名函式

  • 在傳入函式時,有些時候,不需要顯式地定義函式,直接傳入匿名函式更方便
  • Python 提供了 lambda 表示式對匿名函式提供支援

 

lambda 表示式的語法

lambda args: expression

expression 只允許是一條表示式,所以使用很受限  

 

lambda 表示式小栗子

lambda x:x>2

等價函式寫法

def select_positive(x):
    return x > 0

 

使用 lambda 表示式重寫上面的將函式作為引數傳遞

def test(list, select_fun):
    for item in list:
        if select_fun(item):
            print(item)


list = [1, -1, 2, -2, 3, -3]

test(list, lambda x: x > 0)
test(list, lambda x: x < 0)


# 輸出結果
1
2
3
-1
-2
-3

 

map 函式

使用 Python 內建的 map 函式時,通常會用到 lambda 表示式 

 

函式語法

map(function, list)
  • map 函式接收兩個引數 function 和 list
  • function 是一個函式,list 是一個可以被遍歷的序列
  • map 將傳入的函式依次作用到序列的每個元素,並把結果作為新的序列返回

 

map 函式原理

  • 圖的左邊是一個序列 list,包含 3 個元素 1、2、3
  • 呼叫函式 map 時,需要提供一個函式 y = f (x),函式 f 將輸入 x 對映為輸出 y
  • 將函式 f 對圖的左邊的序列中的每個元素依次作用,得到圖的右邊的序列
  • 圖的右邊是一個序列 list,包含 3 個元素 f (1)、f (2)、f (3)

 

非 lambda 的寫法

list = [1, 2, 3]


def test(x):
    x += 5
    return x


list1 = map(test, list)
for i in list1:
    print(i)


# 輸出結果
6
7
8

 

lambda 的寫法

list = [1, 2, 3]

list1 = map(lambda x: x + 5, list)
for i in list1:
    print(i)


# 輸出結果
6
7
8

 

lambda 表示式栗子一:將 lambda 賦值給變數

  • 將 lambda 表示式賦值給一個變數
  • 這樣呼叫這個變數,相當於呼叫了一個函式
f = lambda a, b: a if a > b else b
print(f(1, 2))


# 輸出結果
2


# lambda 表示式等價寫法
def test(a, b):
    if a > b:
        return a
    else:
        return b

 

lambda 表示式栗子二:將 lambda 作為函式引數傳遞

f = lambda x: x if x > 0 else 0


def test(f, x):
    if f(x):
        print("正數")
    else:
        print("負數")


test(f, 1)
test(f, -1)


# 輸出結果
正數
負數


# lambda 表示式等價寫法
def func(x):
    if x > 0:
        return x
    else:
        return 0

 

lambda 表示式栗子三:將 lambda 作為函式返回值

f = lambda a, b, c: a * b * c


def test(a, b, c):
    a += 1
    b += 2
    c += 3
    return f(a, b, c)


print(test(1, 2, 3))


# 輸出結果
48


# 等價寫法
def test(a, b, c):
    return a * b * c

 

Python 內建函式接受函式作為引數

  • filter(function, iterable):用於過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表
  • sorted(iterable, cmp=None, key=None, reverse=False):對所有可迭代的物件進行排序操作
  • map(function, iterable, ...):根據提供的函式對指定序列做對映
  • reduce(function, iterable[, initializer]):會對引數序列中元素進行累積

後面再詳說這些函式

 

總結

lambda 表示式常用場景:當某些功能程式碼只用一次的時候,可以用 lambda 代替
 

相關文章