def run(a,*args):
#第一個參數傳給了a
print(1,a)
# args是一個元組,裏面是2和3兩個參數
print(2,args)
# *args是將這個元組中的元素依次取出來
print(3,"對args拆包")
print(4,*args) # *args 相當於 a,b = args
print(5,"將未拆包的數據傳給run1")
run1(args)
print(6,"將拆包後的數據傳給run1")
run1(*args)
def run1(*args):
print(7,"輸出元組")
print(8,args)
print(9,"對元組進行拆包")
print(10,*args)
run(1,2,3) #後面的2和3
- 下面是上面程序的輸出結果:
1 1
2 (2, 3)
3 對args拆包
4 2 3
5 將未拆包的數據傳給run1
7 輸出元組
8 ((2, 3),)
9 對元組進行拆包
10 (2, 3)
6 將拆包後的數據傳給run1
7 輸出元組
8 (2, 3)
9 對元組進行拆包
10 2 3
def run(**kwargs):#傳來的 key = value 類型的實參會映射成kwargs裏面的鍵和值
# kwargs是一個字典,將未命名參數以鍵值對的形式
print(kwargs)
print("對kwargs拆包")
# 此處可以把**kwargs理解成對字典進行了拆包,{"a":1,"b":2}的kwargs字典又
# 被拆成了a=1,b=2傳遞給run1,但是**kwargs是不能像之前*args那樣被打印出來看的
run1(**kwargs)
#print(**kwargs)
def run1(a,b): #此處的參數名一定要和字典的鍵的名稱一致
print(a,b)
run(a=1,b=2)
- 執行結果如下:
{'a': 1, 'b': 2}
對kwargs拆包
1 2
總結
-
*args作爲形參時是用來接收多餘的未命名參數,而**kwargs是用來接收key=value這種類型的命名參數,args是元組,kwargs是字典。
-
*和**在函數體中除了拆包之外,並沒有什麼卵用。
-
裝包的含義就是把未命名參數和命名參數分別放在元組或者字典中。上述代碼run(1,2,3)就是一個裝包得過程