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