簡介
Functional Programming中文翻譯成函數式編程, 是函數的更進階的用法. 所以若還不是很理解函數的運作, 請先研讀 Functions這編文章
函數式編程講白了, 就是要把函數本身當成變數, 傳送給其他函數. 函數式編程並不是Python專有的技術, 大多程式語言都可以實作出來, 如 C的函數指標, C# 的delegate, 甚至連JavaScript都可以實作出來. 如果您是專精Java的話, 那就只有在Java SE8才開始支援, 也就是所謂的Lambda.
C的函數指標很早就有了, 一般人比較少去接觸到這個領域, 再加上C#, Python也是最近這幾年才開始流行, Java更是到了8版才支援, 所以才會誤以為是新的領域. 近來程式愈來愈複雜, 要求的功能愈來愈多, 所以函數指標就突顯了其強大的功能及重要性.
指標函數(Indicator functions) : 函數的傳回值為一指標型態
函數指標(function pointer) : 指標指向函數, 可以把函數當成變數, 傳遞給其他函數的參數
函數名稱
以abs(-10)函數為例, 會返回參數的絕對值. abs為系統的內建函數, 但如果把 abs直接印出來會怎樣呢?
print(abs) 結果 : <built-in function abs>
說實在, 熟強型語言的人, 是絕對不會去寫這種白痴程式的. 但在弱型語言裏, 卻是再正常不過的事. 因為在Python中, 函數名稱就是變數, 他指向一個能計算絕對值的區塊程式碼.
即然是變數, 那如果真的用變數來取代abs會怎樣. 哇咧, f變成了abs的功能
f=abs print(f(-10)) 結果 : 10
那如果把abs指到別的地方呢? 這下子, abs將不再計算絕對值了, 直接變成了變數的功能.
當然啦, 在實際程式碼中, 我們是不可能白痴到直接把abs給幹掉的.
abs=10 print(abs(=1-)) 結果 : Traceback (most recent call last): File "D:/python/venv/recursive.py", line 2, in <module> print(abs(-10)) TypeError: 'int' object is not callable
所以由上面的測試可以歸納出一個結論 : 函數名稱就是變數名稱, 而變數名稱就是函數名稱