python 的函式是「一等公民」,因此函式本身也是乙個物件,函式既可用於賦值,也可用作其他函式的引數,還可作為其他函式的返回值。
python 的函式也是一種值:所有函式都是 function 物件,這意味著可以把函式本身賦值給變數,就像把整數、浮點數、列表、元組賦值給變數一樣。
當把函式賦值給變數之後,接下來程式也可通過該變數來呼叫函式。例如如下**:
# 定義乙個計算乘方的函式 def pow(base, exponent) : result = 1 for i in range(1, exponent + 1) : result *= base return result # 將pow函式賦值給my_fun,則my_fun可當成pow使用 my_fun = pow print(my_fun(3 , 4)) # 輸出81 # 定義乙個計算面積的函式 def area(width, height) : return width * height # 將area函式賦值給my_fun,則my_fun可當成area使用 my_fun = area print(my_fun(3, 4)) # 輸出12從上面**可以看出,程式依次將 pow()、area() 函式賦值給 my_fun 變數,接下來即可通過 my_fun 變數分別呼叫 pow()、area() 函式。
其實 python 已經內建了計算乘方的方法,因此此處的 pow() 函式並沒有太大的實際意義,只是作為示範使用。
通過對 my_fun 變數賦值不同的函式,可以讓 my_fun 在不同的時間指向不同的函式,從而讓程式更加靈活。由此可見,使用函式變數的好處是讓程式更加靈活。
除此之外,程式還可使用函式作為另乙個函式的形參和(或)返回值。
有時候需要定義乙個函式,該函式的大部分計算邏輯都能確定,但某些處理邏輯暫時無法確定,這意昧著某些程式**需要動態改變,如果希望呼叫函式時能動態傳入這些**,那麼就需要在函式中定義函式形參,這樣即可在呼叫該函式時傳入不同的函式作為引數,從而動態改變這段**。
python 支援像使用其他引數一樣使用函式引數,例如如下程式:
上面程式中定義了乙個 map() 函式,該函式的第二個引數是乙個函式型別的引數,這意味著每次呼叫函式時可以動態傳入乙個函式,隨著實際傳入函式的改變,就可以動態改變 map() 函式中的部分計算**。
pthon 3 本身也提供了乙個 map() 函式,python 3 內建的 map() 函式的功能和此處定義的 map() 函式功能類似,但更加強大。
接下來的三行粗體字**呼叫了 map() 函式三次,三次呼叫依次傳入了 square、cube、factorial 函式作為引數,這樣每次呼叫 map() 函式時實際的執行**是有區別的。
編譯、執行上面程式,可以看到如下輸出結果:
原資料: [3, 4, 9, 5, 8] 計算陣列元素的平方
[9, 16, 81, 25, 64] 計算陣列元素的立方
[27, 64, 729, 125, 512] 計算陣列元素的階乘
[6, 24, 362880, 120, 40320]
從上面介紹不難看出,通過使用函式作為引數可以在呼叫函式時動態傳入函式,實際上就可以動態改變被呼叫函式的部分**。
# 獲取map的型別
print(type(map))
執行上面**,將會看到如下輸出結果:
前面己經提到,python 還支援使用函式作為其他函式的返回值。例如如下程式:
def get_math_func(type) : # 定義乙個計算平方的區域性函式 def square(n) : # ① return n * n # 定義乙個計算立方的區域性函式 def cube(n) : # ② return n * n * n # 定義乙個計算階乘的區域性函式 def factorial(n) : # ③ result = 1 for index in range(2 , n + 1): result *= index return result # 返回區域性函式 if type == "square" : return square if type == "cube" : return cube else: return factorial # 呼叫get_math_func(),程式返回乙個巢狀函式 math_func = get_math_func("cube") # 得到cube函式 print(math_func(5)) # 輸出125 math_func = get_math_func("square") # 得到square函式 print(math_func(5)) # 輸出25 math_func = get_math_func("other") # 得到factorial函式 print(math_func(5)) # 輸出120程式中,定義了乙個 get_math_func() 函式,該函式將返回另乙個函式。接下來在 get_math_func() 函式體內的 ①、②、③ 號粗體字**分別定義了三個區域性函式,最後 get_math_func() 函式會根據所傳入的引數,使用這三個區域性函式之一作為返回值。
在定義了會返回函式的 get_math_func() 函式之後,接下來程式呼叫 get_math_func() 函式時即可返回所需的函式,如上面程式中**所示。
4個python常用高階函式的使用方法
1 map python內建了map 函式,map 函式接受兩個引數,乙個是函式,乙個是iterable,map將傳入的函式依次作用到序列的每乙個元素上,並把結果作為新的iterator返回。舉例說明,比如我們有乙個函式f x x 2,要把這個函式作用在乙個list 1,2,3,4,5,6,7,8,...
VLOOKUP函式的使用方法(高階篇)
在學習了vlookup的入門和初級篇後,本文將帶將大家學習vlookup的高階篇 vlookup的模糊查詢。一 字元的模糊查詢 在a列我們知道如何查詢型號為 aaa 的產品所對應的b列 即 vlookup c1,a b,2,0 如果我們需要查詢包含 aaa 的產品名稱怎麼表示呢?如下圖表中所示。公式...
Python內建函式vars 使用方法
vars 為python內建函式,用於返回物件object的屬性和屬性值的字典物件,或者說,返回物件的 dict 屬性,前提是物件具有 dict 屬性,常見如模組 類 例項。語法格式 vars object vars 函式具有乙個可選引數object 返回物件的 dict 屬性 作用同locals ...