教你10分鐘讀懂python閉包和裝飾器

2021-09-11 01:25:52 字數 3766 閱讀 5010

先來講一下閉包的定義,在函式巢狀的情況下,在函式內部使用了外部函式的引數或者變數,並把這個內部函式返回,那麼這個返回的函式就叫做閉包。簡單來說,閉包就是對應乙個函式,不理解沒關係,接下來我們用**講解。

def show():  #外部函式

num = 10 #外部函式的變數

def inner(): #內部函式

print(num) #使用外部函式的變數

return inner #返回內部函式

new_func = show()

print(new_func)

new_func()

這就是乙個簡單的閉包,閉包的應用場景通常是,可以根據引數生成不同的返回函式。同樣舉例說明

"""

普通函式

"""def hello(msg, count):

result = msg * count

return result

result = hello('哈哈', 3)

print(result)

"""利用閉包

"""def hello(msg, count):

def return_msg():

result = msg * count

return result

return return_msg

new_func1 = hello("是我", 4)

result1 =new_func1()

print(new_func1)

print(result1)

new_func2 = hello("是我", 4)

閉包就是這麼簡單,就是根據條件生成不同函式同樣簡單講下什麼是裝飾器,裝飾器本質也是乙個函式,它實現的是對原函式的功能進行擴充套件,好處就是,可以不改變原函式的定義,和呼叫方式。

同樣,舉例說明

def work():

print('i am working...')

work()

你寫了這樣乙個函式,老闆說,小夥子,你工作的很好,在i am working...前給我加幾個橫線。不能改變這個函式的定義和呼叫方式。

ok,開始改造

def decorator(new_func):

def inner():

print('---' * 10)

new_func()

return inner

@decorator #語法糖,直接呼叫decorator函式,等價 work = decorator(work)

def work():

print('i am working...')

work()

ok,改造完成,公升職加薪。這下老闆來了,小夥子幹的漂亮,我這還有乙個帶引數的函式,你幫我改造下,在輸出結果前加上一句話,「輸出結果是「,我們來看下原函式。

def work(num1, num2):

result = num1 + num2

print(result)

work(1, 2)

改造開始!

def decorator(new_func):

def inner(num1, num2): #加上原函式的引數

print('輸出結果是:')

new_func(num1, num2) #加上原函式的引數

return inner

@decorator #語法糖,直接呼叫decorator函式,等價 work = decorator(work)

def work(num1, num2):

result = num1 + num2

print(result)

work(1, 2)

老闆:不錯不錯,你再給我在work函式後面加個return,把resut,return回去。你心裡罵了句mmp,然後直接加了個return,此時

程式執行結果。

沒有執行結果。你仔細看了下程式分析了原因。

當我們呼叫work時候,開始執行裝飾器,然後執行inner函式,相當於執行work函式,work函式將返回值給了inner函式,但是inner函式並沒有將返回值給work函式。稍加改造,將new_func返回即可。

**示例如下。

"""

created by young on 2019/2/15 10:05

"""def decorator(new_func):

def inner(num1, num2): #加上原函式的引數

print('輸出結果是:')

return new_func(num1, num2) #加上原函式的引數

return inner

@decorator #語法糖,直接呼叫decorator函式,等價 work = decorator(work)

def work(num1, num2):

result = num1 + num2

return result

result = work(1, 2)

print(result)

ok,接下來萬惡的老闆布置了新任務,你給我寫乙個通用的裝飾器吧,一秒完成乙個可以相容任意引數和有無返回值的裝飾器。

def decorator(new_func):

def inner(*args, **kwargs):

print('輸出結果是:')

return new_func(*args, **kwargs)

return inner

老闆說,你給這個裝飾器加乙個引數吧,這難得到你嗎?肯定不。

我們選擇在裝飾器外面巢狀乙個函式傳參,即可完成。看**示例

def get_decorator(char):

def decorator(new_func):

def inner(*args, **kwargs):

print(char)

return new_func(*args, **kwargs)

return inner

return decorator

@get_decorator('我是引數') #語法糖,直接呼叫decorator函式,等價 work = decorator(work)

def work(num1, num2):

result = num1 + num2

return result

result = work(1, 2)

print(result)

python命名空間(五分鐘讀懂)

1.命名空間指的是變數儲存的位置,每乙個變數都需要儲存到指定的命名空間當中 2.每乙個作用域都會有乙個它對應的命名空間 3.全域性命名空間,用來儲存全域性變數。函式命名空間用來儲存函式中的變數 4.命名空間實際上就是乙個字典,是乙個專門用來儲存變數的字典 1.在全域性作用域中呼叫locals 則獲取...

三分鐘教你讀懂匯票是什麼

匯票 1 匯票的概念及特點 匯票 draft 是出票人簽發的,委託付款人在見票時或者在指定日期無條件支付確定金額給收款人或者持票人的票據。出票人 金融機構 銀行匯票 銀行以外的企業和其他組織 商業匯票 匯票的特點 1 匯票是一種證實貨幣權利的金融工具 2 匯票是具有支付功能的金融工具 3 匯票是具有...

三分鐘教你讀懂票據是什麼

票據業務 票據 cheque 出票人開立的,承諾由付款人到期向持票人支付一定確定金額的承諾。1 票據的記載事項 票據記載事項分為a類 絕對記載事項 必填 b類 相對或任意記載事項 選填 c類 不產生 票據法 效力的記載事項 記載也無效力 分類記載事項備註a 出票人簽章 簽章生效 a無條件支付 票據無...