函式名應用,閉包,裝飾器初識

2022-03-17 06:25:35 字數 3749 閱讀 9520

一、函式名的應用

函式名是乙個變數,但他是乙個特殊的變數,與括號配合可以執行函式的變數。

1、函式名的記憶體位址

def

func():

print('哈哈'

)print

(func)

結果:

2、函式名可以賦值給其他變數

def

func():

print('哈哈'

)print

(func)

a =func #把函式當成乙個變數,賦值給另乙個變數

a() #呼叫函式 func()

3、函式名可以當做容器類元素

def

func1():

print('哈哈'

)def

func2():

print('呵呵'

)def

func3():

print('嘻嘻'

)lst =[func1,func2,func3]

for i in

lst:

i()

4、函式名可以當做函式的引數

def

func():

print('

吃了嗎?')

deffunc2(fn):

print('

我是func2')

fn()

#執行傳遞過來的fn

print('

我是func2')

func2(func)

#把函式func當成引數傳遞給func2的引數fn

5、函式名可以作為函式的返回值

def

func1():

print('

這裡是函式1')

deffunc2():

print('

這裡是函式2')

print('

這裡是函式1')

return

func2

fn = func1() #

執行函式1,函式1返回的是函式2,這時fn指向的就是上面函式2

fn() #

執行上面返回的函式

執行結果:

這裡是函式1

這裡是函式1

這裡是函式2

二、閉包

閉包就是內層函式對外層函式(非全域性)變數的引用。

def

func1():

name = '

alex

'def

func2():

print

(name) #閉包

func2()

func1()

#結果: alex

我們可以使用_closure_來檢測函式是否是閉包,使用函式名._closure_返回cell就是閉包,返回none就不是閉包。

def

func1():

name = '

alex

'def

func2():

print

(name)

func2()

print(func2.__closure__

) #(,)

func1()

如何在函式外邊呼叫內部函式呢?   return

def

func1():

name = '

alex'#

內部函式

deffunc2():

print

(name)

return

func2

fn = func1() #

訪問外部函式,獲取到內部函式的函式位址

fn() #

訪問內部函式

如果多層巢狀呢,只需要一層一層的往外層返回就行了

def

func1():

deffunc2():

deffunc3():

print('哈哈'

)

return

func3

return

func2

func1()()()

python規定,如果你在記憶體函式中訪問了外層函式的變數,那麼這個變數將不會消亡,將會常駐記憶體。也就是說,使用閉包,可以保證外層函式中的變數在記憶體中常駐。

閉包的作用就是讓乙個變數能夠常駐記憶體,供後面的程式使用。

三、裝飾器初識

軟體設計原則

一、開閉原則。                      開放:對功能擴充套件開放                       封閉:對修改**封閉

def

fruit():

print('結果'

)def

water(fn):

definner():

print('澆水'

) fn()

print('開花'

)

return

inner

fruit =water(fruit)

fruit()

語法糖:@裝飾器

def

water(fn):

definner():

print('澆水'

) fn()

print('開花'

)

return

inner

@water

#相當於fruit = water(fruit)

deffruit():

print('結果'

)fruit()

帶返回值的裝飾器

def

wen_jin(fn):

def inner(*args,**kwargs):

print('

質量怎麼樣')

ret = fn(*args,**kwargs)

print('騙我'

)

return

ret

return

inner

@wen_jin

defyue(name):

print('

約一約'

,name)

return

'小蘿莉

'ret = yue('

小姐姐'

)print(ret)

裝飾器模型**

#

裝飾器:對傳遞進來的函式進行包裝,可以在目標函式之前和之後新增任意的功能

def

def inner(*args,**kwargs):

'執行目標函式之前要執行的內容

'ret = func(*args,*kwargs)

'執行目標函式之後要執行的內容

'return

ret

return

inner

#def

target_func():

print('

我是目標函式')

#呼叫目標函式

target_func()

Day 11 函式名,閉包,裝飾器 作業

1 整理裝飾器的形成過程,背誦裝飾器的固定格式 2 編寫裝飾器,為多個函式加上認證的功能 使用者的賬號密碼 於檔案 要求登入成功一次,後續的函式都無需再輸入使用者名稱和密碼 3.1.為題目3編寫裝飾器,實現快取網頁內容的功能 公升級題 4.寫函式,返回乙個撲克牌列表,裡面有52項,每一項是乙個元組 ...

Python函式閉包裝飾器

x 2222 print x def func1 x 65842 deffunc2 x 65412 print x func2 func1 print x 2222 65412 2222 global 呼叫全域性變數 x 8888 deffunc1 deffunc2 global x x 10000...

閉包 裝飾器

外部函式返回內部函式的引用 內部函式可以直接使用外部函式的環境變數 語法 外部函式通過返回內部函式的引用 內部函式可以直接使用外部函式的 環境變數 自由變數 函式執行時間統計 執行函式前預備處理 執行函式後清理功能 許可權校驗等場景 快取有且只有乙個引數 指向了被裝飾的函式的引用 使用裝飾器 裝飾器...