Python學習之路 高階函式

2021-09-29 00:12:08 字數 3221 閱讀 2629

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 ...