1. 程式人生 > >python中的星號'*'和雙星號'**'

python中的星號'*'和雙星號'**'

參考連結pythontab
python中’*’和’**’的使用分兩個方面,一個是計算,另一個是引數傳遞過程中元素的打包和解包。
1. ‘*’和’**’在python中最常見的作用分別是‘相乘’和‘乘冪’,如下:

>>> a  = 2
>>> b = 3
>>> c = 5*6
>>> d = 4**3
>>> e = a*b
>>> f = a**b
  1. 對函式傳遞的引數進行打包(成元組tuple或字典dictionary)和拆解(分解成單個元素),其中元組的打包和解包使用單星號‘*’,字典的打包和拆解使用’**’。
    注:非關鍵字引數和非關鍵字引數1

    a. 打包,就是將傳遞給函式的任意多個(也可以是零個)非關鍵字引數/關鍵字引數打包成一個元組/字典(元組只能接收非關鍵字引數,字典只能接收關鍵字引數)
    元組打包的例子
#!/usr/bin/env python
#coding=utf-8
def tuple_pack(a, *b):
    print(a)
    print(b)
tuple_pack(1,2,3,4,5)

輸出的結果是:

1
(2,3,4,5)

在該例子中,*b這個位置可以接收任意多個(也可以是零個)非關鍵字引數,並將收集到的引數轉換成一個元組。
字典打包的例子

#!/usr/bin/env python
#coding=utf-8 def dictionary_pack(a, **b): print(a) print(b) dictionary_pack(1,one=1,two=2,three=3,four=4)

輸出的結果是:

1
{'four':4'one':2,'three':4,'two':3}

在該例子中,**b這個位置可以接收任意多個(也可以是零個)關鍵字引數,並將收集到的引數轉換成一個字典。
元組和字典混合的例子

#!/usr/bin/env python
#coding=utf-8
def tuple_dictionary_pack(*a, **b)
:
print(a) print(b) tuple_dictionary_pack(1,2,3,one=2,two=2)

輸出的結果是:

(1,2,3)
{'one':4,'two':5}

在該例子中,*a這個位置負責接收任意多個非關鍵字引數,**b這個位置可以接收任意多個關鍵字引數,注意二者在函式定義中的順序不能顛倒。
b. 拆解,就是將傳遞給函式的一個列表、元組或字典拆分成獨立的多個元素然後賦值給函式中的參變數(包括普通的位置引數,關鍵字引數,元組也即*非關鍵字引數,字典也即**關鍵字引數)。在解字典時會有兩種解法,一種使用*解,解出來傳給函式的只有鍵值(.key)另一種是用**解,解出來的是字典的每一項。
位置變數和元組混合拆解的例子

#!/usr/bin/env python
#coding=utf-8
def variable_tuple_unpack(a,b,c,*d):
    print(c)
    print(d)
ee = [1,2,3,4,5]
variable_tuple_unpack(*ee)

輸出的結果是:

3
(4,5)

元組和字典混合的例子

#!/usr/bin/env python
#coding=utf-8
def tuple_dictionary_unpack(*a,**b):
    print(a)
    print(b)
ee = (1,2,3)
ff = {'one':1,'two':2,'three':3} 
tuple_dictionary_unpack(*ee,**ff)

輸出的結果是:

(1,2,3)
{'one':1,'three':3,'two':2}

字典的鍵值解成元組的例子

#!/usr/bin/env python
#coding=utf-8
def tuple_dictionary(*a):
    print(a)
ff = {'one':1,'two':2,'three':3} 
tuple_dictionary(*ff)

輸出的結果是:

('one','three','two')


  1. 非關鍵字引數指的就是位置引數,在函式引數傳遞中根據順序對變數賦值;關鍵字引數可以根據變數的關鍵字亂序賦值,關鍵字引數也會在函式定義中賦予初值。另外,非關鍵字引數不可以通過關鍵字賦值,但是關鍵字引數可以通過位置引數賦值;而且在函式定義時,關鍵字引數後不能有非關鍵字引數。