#1 #參數僅包含必選參數 def func(x,y): y.append(x) print("%s" % y) func(1,[]) #>>[1] func(2,[]) #>>[2] #2 #參數包含必選和可選參數,帶默認值的參數爲可選參數 #若參數默認值爲可變對象,默認參數保留了每次函數調用的修改 def func(x,y=[]): y.append(x) print("%s" % y) func(1) #>>[1] func(2) #>>[1, 2] #爲了防止以上狀況發生,默認值改成none,並在函數體內加入檢查代碼 def func(x,y=None): if y is None: y=[] y.append(x) print("%s" % y) func(1) #>>[1] func(2) #>>[2] #3 #函數參數調用,有兩種方法,一種是使用位置參數,一種是使用關鍵字參數 def foo(w,x,y,z): pass foo(1,2,3,4) foo(1,2,z=4,y=3) #使用關鍵字參數時,參數的順序並不重要 #4 #可變長參數列表,在定義函數時,使用*和** #使用*,將全部餘下參數做爲元組放入args變量,在函數內調用別的函數時,使用*args,將args元組從新轉爲參數列表,傳遞給被調用函數 def foo1(x,*args): print("foo1: p1=%s,p2=%s" % (x,args)) def foo(w,x,*args): print("foo: p1=%s,p2=%s,p3=%s" % (w,x,args)) foo1(x,*args) foo(1,2,3,4,5,6) #>>foo: p1=1,p2=2,p3=(3, 4, 5, 6) #>>foo1: p1=2,p2=(3, 4, 5, 6) #使用**,將全部餘下的關鍵字參數做爲字典放入kwargs變量 def foo(w,x,**kwargs): print("foo: p1=%s,p2=%s,p3=%s" % (w,x,kwargs)) foo(1,x=2,y=3,z=4) #>>foo: p1=1,p2=2,p3={'y': 3, 'z': 4} #同時使用*和** def foo(w,*args,**kwargs): print("foo: p1=%s,p2=%s,p3=%s" % (w,args,kwargs)) foo(1,2,3,y=4,z=5) #>>foo: p1=1,p2=(2, 3),p3={'y': 4, 'z': 5}
閉包和裝飾器的兩篇不錯的文章html
https://foofish.net/understand-decorator.htmlpython
https://foofish.net/python-decorator.html閉包