Python之閉包 裝飾器及高階函式

2021-09-24 02:19:49 字數 3668 閱讀 3397

存在於兩個巢狀關係的函式中,而且閉包是內部函式

內部函式引用了外部函式的變數

外部函式會把內部函式的函式名稱返回。

例如:

def outer(i=1):

li=[i]

def inner():

li[0]+=1

return li

return inner

out=outer(11)

print(out())

輸出結果:

[12]

因為outer()為乙個函式不能直接列印,需要賦值給乙個變數,由變數代替列印。

且此時接收變數也為函式,必須在變數名後加小括號才能列印出值。

注意當內部函式呼叫外部變數為乙個簡單變數時,需要加nonlocal關鍵字

例如:

def outer1(i=1):

def inner1():

nonlocal i

i+=1

return i

return inner1;

out1=outer1(11)

print(out1())

輸出結果:

12

當函式在引數列表例項化時只執行一次

第二次呼叫不再初始化引數,資料操作錯誤

例如:

def abc(i, li=):

print(li)

abc(1)

abc(2)

abc(3)

輸出結果:

[1][1, 2]

[1, 2, 3]

如果要在引數列表初始化引數需要加限定條件

例如:

def abc(i, li=none):

if(li == none):

li = list()

print(li)

abc(1)

abc(2)

abc(3)

輸出結果:

[1][2]

[3]

裝飾器的本質是乙個python函式,它可以在不改動其他函式的前提下,對函式的功能進行擴充。

從程式設計原則來講:開閉原則

從設計模式來講:**模式實現

從架構來講:過濾器(filter) 或者 aop(aspect oriented programming)

例如:增加許可權、日誌功能

def before(func):

print("許可權管理......")

def inner():

func()

print("許可權管理功能......")

return inner

def after(func):

print("日誌管理......")

def inner():

func()

print("日誌管理功能......")

return inner

@after

@before

def demo():

print("正常業務邏輯......")

demo()

輸出結果:

許可權管理......

日誌管理......

正常業務邏輯......

許可權管理功能......

日誌管理功能......

當有多個裝飾器應用在乙個函式上時,它們的呼叫順序是自下而上的。

裝飾器對帶有返回值的函式進行裝飾

需要返回函式並不是呼叫

例如:

def one(func):

def inner():

print("after.......")

return func()

return inner

@one

def login():

return "返回成功"

print(login())

輸出結果:

after.......

返回成功

裝飾器對有引數函式進行裝飾

如果被裝飾函式有引數,給內部函式和裝飾器中呼叫函式加上引數列表即可

例如:

def before(func):

def inner(i,j):

print("before........")

func(i,j)

return inner

@before

def add(i,j):

print(i+j)

add(1,2)

輸出結果:

before........

3

函式式程式設計可併發,更能發揮多核處理器的優勢。

map()函式

map函式會根據提供的函式對指定的序列做對映。

map(function, iterable,…)

配合lambda函式更好用哦!

例如:

li=[1,2,3,4,5]

m=map(lambda x:x**3,li)

print(list(m))

輸出結果:

[1, 8, 27, 64, 125]

f1=list(filter(lambda x:x%2==0,li))

print(f1)

輸出結果:

[2, 4]

f2=list(filter(lambda x:x%2,li))

print(f2)

輸出結果:

[1, 3, 5]

reduce()函式

reduce函式會對引數迭代器中的元素進行累積。

reduce(function, iterable[, initializer])

reduce函式會依次從迭代器物件中取出每個元素,和上一次呼叫function的結果做為引數再次呼叫function函式.

在python3中reduce函式被放置在functools模組中,使用時需要先引用

from functools  import reduce

r=reduce(lambda x,y:x+y,li)

print(r)

輸出結果:

15

如果在呼叫reduce函式時傳入initializer引數,那麼function函式會以迭代器中的第乙個引數與initializer的和作為引數進行呼叫。

例如:

from functools  import reduce

r=reduce(lambda x,y:x+y,li,5)

print(r)

輸出結果:

20

filter()函式

filter函式會對指定序列執行過濾操作

filter(function, iterable)

filter函式的作用是以引數迭代器中的每個元素分別呼叫function函式,最後返回的迭代器包含呼叫結果為true的元素。

例如:

li1=list(map(lambda x:x+1,li))

print(li1)

li2=list(filter(lambda x:x%2,li1))

print(li2)

輸出結果:

[2, 3, 4, 5, 6]

[3, 5]

Python之閉包裝飾器

1.什麼是閉包?多層函式巢狀,函式裡面還有定義函式,一般是兩個 往往內層函式會用到外層函式的變數,把內層函式以及外部函式的變數當成乙個特殊的物件,這就是閉包。閉包比物件導向更純淨 更輕量,既有資料又有執行資料的 比普通函式功能更強大,不僅有 還有資料 2.匿名函式 普通函式 閉包 物件導向的區別?1...

Python閉包 裝飾器

閉包 legb法則 所謂閉包,就是將組成函式的語句和這些語句的執行環境打包一起時得到的物件 閉包最重要的價值在於封裝上下文環境 下面有個列子來解釋下閉包 列 deffunx x print 開始 deffuny y returnx y print 結束 returnfuny x funx 4 pri...

python 閉包 裝飾器

2.閉包格式 return bar 返回內嵌函式 in test print in 3.使用原理 4.總結 二 裝飾器 2.格式 return test in 閉包函式返回內嵌函式 test aa test aa 裝飾 def aa 這兒如果有引數,test in也必須有一樣的引數,test in中...