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 代替