在python編程中經(jīng)常見(jiàn)到星號(hào)*和**,這里對(duì)其含義進(jìn)行介紹。 參考文章 一,、普通含義** 在python里面表示冪運(yùn)算 二、傳遞實(shí)參和定義形參所謂實(shí)參就是調(diào)用函數(shù)時(shí)傳入的參數(shù),,形參則是定義函數(shù)是定義的參數(shù),。 1,、調(diào)用函數(shù)時(shí)使用*
def foo(a,b): print(a) print(b) args = [1,2] #這里只能有兩個(gè)元素 foo(*args) 得到的結(jié)果為
2,、調(diào)用函數(shù)時(shí)使用**
def foo(a,b): print(a) print(b) kwargs = {'a':1,'b':2} #這里只能是'a'和'b' foo(**kwargs) 得到的結(jié)果為
三,、定義函數(shù)參數(shù)時(shí)使用參數(shù)前面加上星號(hào) ,意味著參數(shù)的個(gè)數(shù)不止一個(gè),,另外帶一個(gè)星號(hào)參數(shù)的函數(shù)傳入的參數(shù)存儲(chǔ)為一個(gè)元組(tuple),,帶兩個(gè)星號(hào)則是表示字典(dict)。 1、帶一個(gè)星號(hào)的參數(shù)收集模式這種模式是在函數(shù)定義時(shí)在某個(gè)形參前面加一個(gè)星號(hào),,調(diào)用時(shí)按位置匹配不帶星號(hào)的形參和實(shí)參,,多余的實(shí)參都將作為一個(gè)元組的元素保存到星號(hào)對(duì)應(yīng)的形參中。 def test(*args): ... 定義函數(shù)參數(shù)時(shí) * 的含義,,如這里 *args 表示把傳進(jìn)來(lái)的位置參數(shù)都裝在元組 args 里面,。比如說(shuō)上面這個(gè)函數(shù),調(diào)用 test(1, 2, 3) 的話,, args 的值就是 (1, 2, 3) ,。 示例如下: def foo(a, b, c, *args): print("a = %s" % (a,)) print("b = %s" % (b,)) print("c = %s" % (c,)) print(args) foo("testa", "testb", "testc", "excess", "another_excess") 得到的結(jié)果為
在這里,由于我們?cè)跍y(cè)試位置參數(shù),,多余的參數(shù)必須在末尾,,并且*args將它們打包成一個(gè)元組。 2,、帶兩個(gè)星號(hào)的參數(shù)收集模式:帶一個(gè)星號(hào)的參數(shù)收集模式的收集參數(shù)不能收集關(guān)鍵字參數(shù)傳遞的實(shí)參,,要收集關(guān)鍵字參數(shù)傳遞的實(shí)參,需要在收集參數(shù)前使用兩個(gè)星號(hào),,此時(shí)收集參數(shù)對(duì)應(yīng)的是一個(gè)字典而不是元組,。 def test(**kwargs): ... 類似的, ** 就是針對(duì)關(guān)鍵字參數(shù)和字典的了,。 調(diào)用 test(a=1,b=2,c=3) 的話,, kwargs 的值就是 {“a”:1,“b”:2,“c”:3} 了,。 普通的參數(shù)定義和傳遞方式和 * 們都可以和平共處,不過(guò)顯然 * 必須放在所有位置參數(shù)的最后,,而 ** 則必須放在所有關(guān)鍵字參數(shù)的最后,,否則就要產(chǎn)生歧義了。 示例如下: def foo(a, b, c, **kwargs): print("a = %s" % (a,)) print("b = %s" % (b,)) print("c = %s" % (c,)) print(args) foo(a="testa", d="excess", c="testc", b="testb", k="another_excess") foo("testa", "testc", "testb", d="excess", k="another_excess") 得到的結(jié)果為
也就是說(shuō),,在foo函數(shù)的簽名中只有參數(shù)a, b, c,。由于d和k不存在,它們被放入args字典,。 四,、綜合示例例1def foo(a,b,c,*args): print("a=%s" % (a,)) print("b=%s" % (b,)) print("c=%s" % (c,)) print("args=%s" % (args,)) argtuple = ("testa","testb","testc","excess1","excess2") foo(*argtuple) 得到的結(jié)果為
例2def foo(a,b,c,**args): print("a=%s" % (a,)) print("b=%s" % (b,)) print("c=%s" % (c,)) print("args=%s" % (args,)) argdict = dict(a="testa", b="testb", c="testc", excessarg="string") foo(**argdict) 得到的結(jié)果為
例3def foo(a,b,*args,**kwargs): print(a) print(b) print(args) print(kwargs) foo(1,2,3,4,e=5,f=6) 得到結(jié)果為
|
|