Python 中星號作用:解包&打散
阿新 • • 發佈:2018-01-24
列表 col 使用 python shel == pri pan num
python中’*’和’**’的使用分兩個方面,一個是計算,另一個是參數傳遞過程中元素的打包和解包。
計算方面
‘*’和’**’在python中最常見的作用分別是‘相乘’和‘乘冪’,如下:
>>> a = 2
>>> b = 3
>>> c = 5*6
>>> d = 4**3
>>> e = a*b
>>> f = a**b
傳遞、打包、解包方面
函數的可變參數
- 對函數傳遞的參數進行打包(成元組tuple或字典dictionary)和拆解(分解成單個元素),其中元組的打包和解包使用單星號‘*’,字典的打包和拆解使用’**’。
- 打包,就是將傳遞給函數的任意多個(也可以是零個)非關鍵字參數/關鍵字參數打包成一個元組/字典(元組只能接收非關鍵字參數,字典只能接收關鍵字參數)
當函數的參數前面有一個星號*的時候表示這是一個可變的位置參數,兩個星號**表示是可變的關鍵字參數。
def foo(*args, **kwarg): for item inargs: print item for k,v in kwarg.items(): print k,v print 30*‘=‘ if __name__ == ‘__main__‘: foo(1, 2, 3, a=4, b=5) foo(2, 3, a=4, b=5, c=1)
輸出如下:
C:\Users\BigTree\AppData\Local\Programs\Python\Python36\python.exe "C:/Python S8/develops/Day 2 控制語句/星號用法.py" 1 2 3 a4 b 5 ************************************************** 2 3 a 4 b 5 c 1 ************************************************** Process finished with exit code 0
這樣我們可以傳入任意個數的參數。
解包/打散(unpack)參數
- 拆解,就是將傳遞給函數的一個列表、元組或字典拆分成獨立的多個元素然後賦值給函數中的參變量(包括普通的位置參數,關鍵字參數,元組也即*非關鍵字參數,字典也即**關鍵字參數)。
- 在解字典時會有兩種解法,一種使用*解,解出來傳給函數的只有鍵值(.key)另一種是用**解,解出來的是字典的每一項。
星號*把序列/集合解包(unpack)成位置參數,兩個星號**把字典解包成關鍵字參數。
下面通過示例來進一步加深理解:
def foo(*args, **kwarg): for item in args: print(item) for k,v in kwarg.items(): print(k, v) print(‘*‘ * 50) if __name__ == ‘__main__‘: #foo(1, 2, 3, a=4, b=5) #foo(2, 3, a=4, b=5, c=1) v = (1, 2, 4) v2 = [11, 15, 23] d = {‘a‘:1, ‘b‘:12} foo(v, d) foo(*v, **d) foo(v2, d) foo(*v2, **d)
輸出如下:
C:\Users\BigTree\AppData\Local\Programs\Python\Python36\python.exe "C:/Python S8/develops/Day 2 控制語句/星號用法.py" (1, 2, 4) {‘a‘: 1, ‘b‘: 12} ************************************************** 1 2 4 a 1 b 12 ************************************************** [11, 15, 23] {‘a‘: 1, ‘b‘: 12} ************************************************** 11 15 23 a 1 b 12 ************************************************** Process finished with exit code 0
上面的示例中如果v、v2、d
沒有加星號那麽就當成了一個參數傳遞給了函數,如果加了星號那麽就會解包後傳遞給函數。
foo(*d, **d)
等價於foo(1, 2, 4, a=1, b=12)
。
幾個註意點
可變位置參數*args是一個元組,是不可修改的。
>>> def foo(*args): ... args[0] = 5 ... >>> foo(1, 2, 3) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in foo TypeError: ‘tuple‘ object does not support item assignment >>> l = [1, 2, 3] >>> foo(*l) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in foo TypeError: ‘tuple‘ object does not support item assignment
無論我們怎麽傳入參數,args
都是一個tuple類型,不能進行修改。
對於字典類型的如果只使用一個型號*那麽傳入的只是字典的鍵。
>>> def foo2(*args, **kwarg): ... print args, kwarg ... >>> d = {‘a‘:1, ‘b‘:2, ‘c‘:3} >>> foo2(*d) (‘a‘, ‘c‘, ‘b‘) {} >>> foo2(**d) () {‘a‘: 1, ‘c‘: 3, ‘b‘: 2}
參考鏈接:http://blog.csdn.net/xiaoqu001/article/details/78823498
Python 中星號作用:解包&打散