天天看點

python之動态參數 *args,**kwargs(聚合,打散)

一、函數的動态參數 *args,**kwargs, 形參的順序

1、你的函數,為了拓展,對于傳入的實參數量應該是不固定,

是以就需要用到萬能參數,動态參數,*args, **kwargs

1,*args 将所有實參的位置參數聚合到一個元組,并将這個元組指派給args

(起作用的是* 并不是args,但是約定俗成動态接收實參的所有位置參數就用args)

def sum1(*args):
    print(args)
sum1(1,2,['hello'])             #是一個元組(1, 2, ['hello'])      

2,**kwargs 将所有實參的關鍵字參數聚合到一個字典,并将這個字典指派給kwargs

(起作用的是** 并不是kwargs,但是約定俗成動态接收實參的所有關鍵字參數就用kwargs)

def fun(*args,**kwargs):
    print(args)
    print(kwargs)
fun(1,2,['a','b'],name='xiaobai',age=18)
# 結果:
# (1, 2, ['a', 'b'])       #位置參數,元組
# {'name': 'xiaobai', 'age': 18}       #關鍵字參數,字典      

2、*的用法

在函數的定義時,*位置參數,**關鍵字參數--->聚合。

在函數的調用(執行)時,*位置參數,**關鍵字參數--->打散。

實參--->*位置參數--->把位置參數打散成最小的元素,然後一個個添加到args裡組成一個元組

l1 = [1,2,3]
l2 = [111,22,33,'xiaobai']
#如果要将l1,l2通過函數整合到一起
# 方法一(實參不用*):
def func1(*args):
    return args[0] + args[1]
print(func1(l1,l2))           #[1, 2, 3, 111, 22, 33, 'xiaobai']

# 方法二(實參用*):
def func1(*args):
    return args
print(func1(*l1,*l2))        #(1, 2, 3, 111, 22, 33, 'xiaobai')      

實參--->**關鍵字參數--->把關鍵字參數打散成最小的元素,然後一個個添加到kwargs裡組成一個字典

def func1(**kwargs):
    print(kwargs)

#func1(name='xiaobai',age=18,job=None,hobby='girl')
func1(**{'name':'xiaobai','age':18},**{'job':None,'hobby':'girl'})

# 結果:
# {'name': 'xiaobai', 'age': 18, 'job': None, 'hobby': 'girl'}      

3、形參的順序(a--->b,代表的順序是寫參數時,要先寫a再寫b)

位置參數--->預設參數

def func(a,b,sex='男'):
    print(sex)
func(100,200)      

位置參數--->*args--->預設參數

def func(a,b,*args,sex='男'):
    print(a,b)
    print(args)
    print(sex)
func(100,200,1,2,34,5,'女',6)
# 結果:
# 100 200               #a,b
# (1, 2, 34, 5,'女',6)  #args
# 男                    #預設參數      

位置參數--->*args--->預設參數--->**kwargs

def func(a,b,*args,sex='男',**kwargs):
    print(a,b)
    print(args)
    print(sex)
    print(kwargs)
func(100,200,1,2,34,5,6,sex='女',name='xiaobai',age=1000)
func(100,200,1,2,34,5,6,name='xiaobai',age=1000,sex='女')
# 兩個的結果都是:
# 100 200              #a,b
# (1, 2, 34, 5, 6)    #args
# 女                  #預設參數修改後的值
# {'name': 'xiaobai', 'age': 1000}     #kwargs

# 若是形參這樣寫:
def func(a,b,*args,**kwargs,sex='男'):
    print(a,b)
    print(args)
    print(sex)
    print(kwargs)
func(100,200,1,2,34,5,6,name='xiaobai',age=1000,sex='女')
# 結果:會報錯,預設參數一定要寫在kwargs前面