Python - lambda 表達式

Python 中的函數是第一類對象

  • 好像不少地方都會看到這樣一句話
  • Python 創始人也說過,全部的對象都是第一類對象

 

什麼是第一類對象

  • 在上面中所說的第一類對象,實際上是指函數做爲一個對象,與其它對象具備相同的地位
  • 具體來講,數值能夠被賦值給變量、做爲參數傳遞給函數、做爲返回值
  • 由於函數和數值具備相同的地位,因此函數也能夠被賦值給變量、做爲參數傳遞給函數、做爲返回值

 

將對象賦值給變量

能夠將數值、字符串、列表、字典類型的對象賦值給變量express

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})

 

將對象用做返回值

能夠將數值、字符串、列表、字典類型的對象做爲函數的返回值spa

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}

 

將函數做爲第一類對象

將函數做爲第一類對象,函數具備和數值、字符串、列表、字典等類型的對象具備相同的地位code

 

將函數賦值給變量

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]
  • 打印輸出列表中的正數
  • 打印輸出列表中的負數

 

包含重複性代碼的解決方法

代碼結構徹底相同,只是條件判斷不一樣blog

# 重複性代碼解決方法
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 表達式 string

 

函數語法

map(function, list)
  • map 函數接收兩個參數 function 和 list
  • function 是一個函數,list 是一個能夠被遍歷的序列
  • map 將傳入的函數依次做用到序列的每一個元素,並把結果做爲新的序列返回

 

map 函數原理

  • 圖的左邊是一個序列 list,包含 3 個元素 一、二、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]):會對參數序列中元素進行累積

後面再詳說這些函數it

 

總結

lambda 表達式經常使用場景:當某些功能代碼只用一次的時候,能夠用 lambda 代替
相關文章
相關標籤/搜索