注:引數和返回值都是乙個函式。
1,無引數
def decotare1(func):print(
"first")
func()
return
#無引數 @decotare1 def run(): print('run!
') run() #結果: first run!
2,有引數
def decotare1(func):print(
"first")
func(a,b) #2
return
#有引數,稱為**段1
@decotare1
def add(a,b):
c = a +b
print(
'結果:%s
' %c)
add(
1,2)
#結果:
first
結果:3
為什麼上述標黃?
你的add(a,b)本身是帶兩個引數的,那麼你返回的函式也應該帶引數,所以#2和#3都帶了引數。
3,引數不確定的時候怎麼辦?
from functools inport wraps #兩個紫色的做固定用法,不會改變原來的意思#因為不佳兩句紫色的那麼函式名字會被改變。鏈結20分鐘左右處。
def decotare1(func):
@wraps(func)
*args,**
kwargs):
print(
"first")
func(
*args,**
kwargs)
return
#無引數
@decotare1
def run():
print(
"second")
run() #
1#有引數
@decotare1
def add(a,b):
c = a +b
print(
'結果:%s
' %c)
add(
1,2) #2
上述**對於無引數的run,和有引數的add來說都能直接呼叫,歸功於:*args,**kwargs。
這裡詳細介紹下*args,**kwargs:
1,*的意義def fun(a,b,c):
... print a,b,c
l = [1,2,3
]>>>fun(*l)
它拆開*後面的數列l的數值作為位置引數,並把這些位置引數傳給函式』fun』來呼叫。
注意:l與對應的fun函式中的引數個數對應。
2,*args 的意義
def fun(*args):
... print args
>>>fun() #這個函式中可以帶任意個引數。
在這裡,」args」是個元組。呼叫函式列印」args」時,他會列印元組中包含的所有數值。
def fun(a,*args):
... print args
>>>fun() #這個函式中也可以帶任意個引數。
3,**的意義
使用」**」呼叫函式,這種方式我們需要乙個字典.
注意:在函式呼叫中使用」
*」,我們需要元組;在函式呼叫中使用」**
」,我們需要字典。
def fun(a, b, c):
... print a, b, c
>>> d=
>>> fun(1, **d)15
7但是:
>>> d =
>>> fun(**d)
traceback (most recent call last):出錯了。
fun(**d)等同於fun(a=7, b=3, d=90
).傳給函式」fun」想要的引數個數,但引數列表中並沒有』d』,呼叫中』d』鍵值引數傳給函式導致typeerror.
4,**kwargs的意義
用」**kwargs」定義函式,kwargs接收除常規引數列表職位的鍵值引數字典。在這裡』kwargs』是個字典。所以字典就需要對應關係,比如fun裡沒c你傳個c進去就沒有用。
def fun(a, **kwargs):
... print a, kwargs
此函式只用乙個位置引數,因為常規引數列表中只有乙個變數』a』.但是通過」**kwargs」,可以傳多個鍵值引數。
>>> fun(1, )
traceback (most recent call last):
file
"", line 1, in
typeerror: fun() takes exactly
1 argument (2
given)
正如錯誤提示,函式』fun』只需要乙個位置引數,卻給了兩個。儘管』kwargs』接收鍵值引數作為乙個字典,但你不能傳乙個字典作為位置引數給』kwargs』.你可以像下面那樣呼叫:
>>> fun(1, **)
day12 作業裝飾器
寫乙個裝飾器 tag要求滿足如下功能 def tag name def test func def new func args,kwargs result func args,kwargs return f return new func return test tag name p defrend...
12 前方高能 裝飾器高階
本節主要內容 1.通過裝飾器回顧 2.函式的有用資訊 3.帶引數的裝飾器 4.多個裝飾器同時裝飾乙個函式 一.通過裝飾器回顧 開閉原則 對增加功能開放,對修改 封閉 裝飾器的作用 在不改變原有 的基礎上給乙個函式增加功能 同用裝飾器的寫法 def inner args,kwargs 在目標函式之前做...
day12 裝飾器高階
day12 裝飾器高階 裝飾器高階 functools.wraps 帶引數的裝飾器 多個裝飾器裝飾用乙個函式 def outer args,kwargs 接收的時候是聚合 成元祖的形式 print args print args def inner args print inner args inn...