1、當下主流的編程方法:
- 函數式編程:函數語言裏定義的函數+數學意義的函數
函數式編程定義:就是用編程語言去實現數學函數,這種函數內對象是永恆不變的,要麼參數是函數,要麼返回值是函數,沒有for和while循環,所有的循環都由遞歸去實現,無變量的賦值(即不用變量去保存狀態),無賦值即不改變。
(1)優點:代碼可讀性好,寫起來簡單
(2)缺點:所有變量在程序運行期間是一直存在的,很佔用資源,
2、函數式編程的特點
(1)不可變數據:不用變量保存狀態,不修改變量
#非函數式:
a=1
def test1():
global a
a+=1
return a
test1()
print(a)
#輸出結果:2
#函數式:
n=1
def test2(n):
return n+1
print(test2(2))
print(n)
#輸出結果:
3
1
(2)第一類對象:函數即“變量”
- 參數可以是函數名
- 返回值可以是函數
(3)尾調用優化(尾遞歸):在函數的最後一步調用另一個函數(最後一行不一定是函數的最後一步,因爲去調用了其他函數)
- 情況一:尾部調用其他函數
def bar(n):
return n
def foo(m):
return bar(m)
對比非尾調用
def bar(n):
return n
def foo(m):
k=bar(m)
return k
注意:這時候是不輸出任何結果的,return不會輸出,只是把函數執行的結果返回並保留在內存;而print則是一般的輸出
- 情況二:函數中有if判斷語句
因爲有if判斷語句不一定返回哪個值
3、尾調用的好處
尾調用的關鍵就是在於在函數的最後一步去調用別的函數,那麼最後一步調用,有什麼好處呢?
根據“函數即變量”的風溼理論,定義a函數,a內調用b函數,在內存中會形成一個調用記錄,又稱“調用幀”,用於保存調用位置和內部變量等信息,即a–>b–>c,直到c返回結果b,c的調用記錄纔會消失,b返回給a,b的調用記錄消失,a返回結果,a的調用記錄消失,所有的調用記錄,都是先進後出,形成了一個“調用棧”
尾調用由於是函數的最後一步操作,所以不需要保留外層的調用記錄,因爲調用位置,內部變量等信息都不會再用到了,只要直接用內層函數的調用記錄,取代外層函數的調用記錄就可以了
、函數式和非函數式的區別