剛開始學習python,python相對于java確實要簡潔易用得多。內存回收類似hotspot的可達性分析, 不可變對象也如同java得Integer類型,with函數類似新版本C++的特性,總體來說理解起來比較輕松。只是函數部分參數的"*"與"**",閉包等問題,著實令人迷糊了一把,弄清概念后寫下此文記錄下來,也希望本文能夠幫助其他初學者。
所以本文是一篇學習筆記,著重于使用的細節和理解上,首先分別介紹了函數各種參數類型在調用和聲明時的區別,及其在混用時需要注意的一些細節,之后講了閉包相關的內容。如果有不對的地方歡迎指正。
函數參數不帶“*”,"*" 與 "**"的區別
理解這個問題得關鍵在于要分開理解調用和聲明語法中3者得區別.
函數調用區別
1. 不同類型的參數簡述
#這里先說明python函數調用得語法為:
代碼如下:
func(positional_args, keyword_args,
*tuple_grp_nonkw_args, **dict_grp_kw_args)
#為了方便說明,之后用以下函數進行舉例
def test(a,b,c,d,e):
print a,b,c,d,e
舉個例子來說明這4種調用方式得區別:
代碼如下:
#-------------------------------
#positional_args方式
>>> test(1,2,3,4,5)
1 2 3 4 5
#這種調用方式的函數處理等價于
a,b,c,d,e = 1,2,3,4,5
print a,b,c,d,e
#-------------------------------
#keyword_args方式
>>> test(a=1,b=3,c=4,d=2,e=1)
1 3 4 2 1
#這種處理方式得函數處理等價于
a=1
b=3
c=4
d=2
e=1
print a,b,c,d,e
#-------------------------------
#*tuple_grp_nonkw_args方式
>>> x = 1,2,3,4,5
>>> test(*x)
1 2 3 4 5
#這種方式函數處理等價于
代碼如下:
a,b,c,d,e = x
print a,b,c,d,e
#特別說明:x也可以為dict類型,x為dick類型時將鍵傳遞給函數
>>> y
{'a': 1, 'c': 6, 'b': 2, 'e': 1, 'd': 1}
>>> test(*y)
a c b e d
#---------------------------------
#**dict_grp_kw_args方式
>>> y
{'a': 1, 'c': 6, 'b': 2, 'e': 1, 'd': 1}
>>> test(**y)
1 2 6 1 1
#這種函數處理方式等價于
a = y['a']
b = y['b']
... #c,d,e不再贅述
print a,b,c,d,e
2. 不同類型參數混用需要注意的一些細節
接下來說明不同參數類型混用的情況,要理解不同參數混用得語法需要理解以下幾方面內容.
首先要明白,函數調用使用參數類型必須嚴格按照順序,不能隨意調換順序,否則會報錯. 如 (a=1,2,3,4,5)會引發錯誤,; (*x,2,3)也會被當成非法.
其次,函數對不同方式處理的順序也是按照上述的類型順序.因為#keyword_args方式和**dict_grp_kw_args方式對參數一一指定,所以無所謂順序.所以只需要考慮順序賦值(positional_args)和列表賦值(*tuple_grp_nonkw_args)的順序.因此,可以簡單理解為只有#positional_args方式,#*tuple_grp_nonkw_args方式有邏輯先后順序的.
新聞熱點
疑難解答