函數式編程python
高階函數編程
A.函數式編程(Functional Programming)介紹編程語言
1.函數是Python內建支持的一種封裝,咱們經過一層一層的函數調用把複雜任務分解成簡單的任務,這種分解能夠稱之爲面向過程的程序設計。函數就是面向過程的程序設計的基本單元。這一點和C語言是一致的。函數式編程
2.計算機和計算的概念:函數
a.在計算機的層次上,CPU執行的是加減乘除的指令代碼,以及各類條件判斷和跳轉指令,因此,彙編語言是最貼近計算機的語言。ui
b.計算則指數學意義上的計算,越是抽象的計算,離計算機硬件越遠。設計
所以對應到編程語言:越低級的語言,越貼近計算機,抽象程度低,執行效率高,好比C語言;越高級的語言,越貼近計算,抽象程度高,執行效率低,好比Lisp語言。code
- 函數式編程就是一種抽象程度很高的編程範式;
- 純粹的函數式編程語言編寫的函數沒有變量 => 任意一個函數,只要輸入是肯定的,輸出就是肯定的 => 咱們稱之爲沒有反作用。
- 而容許使用變量的程序設計語言 => 函數內部的變量狀態不肯定,一樣的輸入,可能獲得不一樣的輸出 => 這種函數是有反作用的。
3.函數式編程的一個特色就是,容許把函數自己做爲參數傳入另外一個函數,還容許返回一個函數。get
4.Python對函數式編程提供部分支持。因爲Python容許使用變量,所以,Python不是純函數式編程語言。input
B.高階函數 Higher-order function
1.變量能夠指向函數:
#!/usr/bin/env python3 a = abs(-10) print(a) b = abs print(b)
sh-3.2# ./intro.py 10 <built-in function abs>
結論:函數自己也能夠賦值給變量,即:變量能夠指向函數。
能夠經過指向函數的變量來調用該函數:
print(b(-199))
199
說明如今變量b指向函數abs(),調用b()至關於調用abs()。
2.函數名是變量:函數名其實就是指向函數的變量。
例如,對於abs()這個方法,abs徹底就是指向該函數的變量。可是若是將abs指向其餘object,就沒法再次調用abs原來指向的函數。
abs = 10 print(abs) print(abs(-10))
10 Traceback (most recent call last): File "./intro.py", line 17, in <module> print(abs(-10)) TypeError: 'int' object is not callable
注:abs函數自己來自模塊builtins,若要改動整個模塊的abs指向,使用如下語句:
import builtins builtins.abs = 10
3.傳入函數:既然變量能夠指向函數,函數的參數能接收變量,那麼一個函數就能夠接收另外一個函數做爲參數,這種函數就稱之爲高階函數。
例如:一個簡單的高階函數
#!/usr/bin/env python3 def addtwonums(a, b) : return a+b def func(a, b, f) : return f(a, b) def main() : a = int(input()) b = int(input()) f = addtwonums print(func(a, b, f)) if __name__ == '__main__': main()
sh-3.2# ./intro2.py 100 99 199
4.把函數做爲參數傳入,這樣的函數稱爲高階函數,函數式編程就是指這種高度抽象的編程範式。
2017/2/10