python語言中,一切皆物件。函式本身也是乙個物件,我們知道函式的引數可以傳遞任意物件,函式的返回值也可以返回任意物件,那麼在python中函式能不能傳遞或者返回乙個函式呢?答案是當然可以,我們把這種傳參為函式或者返回值為函式物件的函式稱為高階函式。
定義:在計算過程中,如果其中後一步都要用到前一步的結果,稱為遞迴的。呼叫自身的函式稱之為遞迴函式。
遞迴式函式有兩個條件
1.**基線條件:**問題可以被分解為最小的問題,當滿足基線條件的時候,遞迴就不在執行了。
2.**遞迴條件:**將問題可以分解的條件。
例題:計算100的階乘結果。
def
fn(n)
:if n ==1:
# 基線條件
return
1else
:# 遞迴條件
return n + fn(n-1)
print
(fn(
100)
)# 5050
對於一些功能簡單,使用次數不多的函式,我們可以將它定義為匿名函式,來節省記憶體空間提高**效率。lambda函式表示式就是用來建立匿名函式的。
語法格式:lambda 引數列表 : 返回值
x =
lambda i:i+
1print
(x(5))
# 6
當我們有一些函式或者資料,不希望使用者知道或者修改的時候,我們就需要對函式或者內部資料進行閉包處理。通過閉包可以建立一些只有當前函式才能訪問的物件,還可以將一些私有的資料藏到閉包中。
形成閉包的條件:
函式巢狀
將內部函式作為返回值返回
內部函式必須使用到外部函式的變數
deffn(
):deffn1
(a):
# fn1函式就是我們想要隱藏的函式
print
(a)return fn1
a = fn()a(
"python"
)# python
在了解裝飾器之前,我們先了解乙個軟體設計模式的開閉原則(ocp):
ocp全稱open closed principle。乙個軟體實體的模組和函式應該對擴充套件開放,對修改關閉。
遵守開閉原則可以極大提高提高系統的可維護性和**的重用性。
為了既不對原有的函式進行修改,又想要拓展原有函式的功能,我們可以通過乙個新的函式來拓展原有函式的功能。這個新的函式就叫裝飾器函式。
原則:拓展函式或類的功能,但不影響原來的呼叫
def
fn1():
# 原函式
sum=
0for i in
range(10
):sum+= i
print
(sum
)def
fn2(old)
:# 裝飾器函式
deffn3
(*args,
**kwargs)
:print
("開始執行函式..."
) old(
)print
("函式執行完畢!"
)return fn3
fn2(fn1)()
# 開始執行函式...
# 45
# 函式執行完畢!
為了使裝飾器變得更加美觀,python中加入了語法糖,語法糖使程式變得更加整潔美觀。
def
fn2(old)
:def
fn3(
*args,
**kwargs)
:print
("開始執行函式..."
) old(
)print
("函式執行完畢!"
)return fn3
@fn2
deffn1()
:sum=0
for i in
range(10
):sum+= i
print
(sum
)
fn1(
)# 開始執行函式...
# 45
# 函式執行完畢!
函式裝飾器即以函式作為裝飾器。
def
fn2(old)
:def
fn3(
*args,
**kwargs)
:print
("開始執行函式..."
) old(
)print
("函式執行完畢!"
)return fn3
@fn2
deffn1()
:sum=0
for i in
range(10
):sum+= i
print
(sum
)
fn1(
)# 開始執行函式...
# 45
# 函式執行完畢!
類裝飾器即以類作為裝飾器。
想要以類作為裝飾器,則必須要在內中實現**__call__魔法方法和__init__魔法方法**。
class
user
(object):
def__call__
(self,
*args,
**kwargs)
:print
('start function...'
) self._fun(
*args,
**kwargs)
print
('function end...'
)def
__init__
(self, fun)
: self._fun = fun
@user
deffun
(*args,
**kwargs)
:print
(*args,
**kwargs)
fun(
'python'
)'''
start function...
python
function end...
'''
python高階學習之路
正規表示式 正規表示式 match函式search函式 match物件 findal函式finditer函式 compile函式 sub函式split函式 正則標誌位和模式 beautifulsoup json模組及jsonpath lxml.etree模組 網路爬蟲 爬取頁面 urllib庫 ur...
python之路 函式高階內容
1 函式巢狀的呼叫 定義函式 defmax2 x,y m x if x y else y 三元運算 結果 if條件成立的結果 if 條件 else if條件不成立的結果 returnm 函式巢狀 defmax4 a,b,c,d res1 max2 a,b res2 max2 res1,c res3 ...
Python高階之路 7 2 1 建立函式
在前面提到,函式是可以呼叫的,而且是可以互動的,既然可以呼叫和互動,那麼久需要有乙個函式名,以及函式引數和返回值。這是函式的三個重要元素,其中函式名是必須的,函式引數和返回值是可選的。如果函式只是簡單的執行某段 並不需要與外部進行互動,那麼函式引數與返回值可以省略。定義函式要使用def語句。def ...