1. 程式人生 > >Python 中星號作用:解包&打散

Python 中星號作用:解包&打散

列表 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 in
args: 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
a 
4 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 中星號作用:解包&打散