一、函数的动态形参,可以传递不确定个数的形参,有两种形式:

(一) *args ,将所有输入组合成一个元组

def func(*args):
    print(args,type(args))    # (123, 'fefe', 23, 45) <class 'tuple'>
func(123,'fefe',23,45)

(二)**kwargs ,将所有输入组合成一个字典

def func(**kwargs):
    print(kwargs,type(kwargs))    # {'f': 'fdefe', 'k2': 3} <class 'dict'>
func(f='fdefe',k2=3)

(三)*args和**kwargs混合使用,可传递任何形式的参数

def func(p,*args,**kwargs):
    print(p,type(p))    # 12 <class 'int'>
    print(args,type(args))    # (43, 'dge') <class 'tuple'>
    print(kwargs,type(kwargs))  # {'f': 'fdefe', 'k2': 3} <class 'dict'>
func(12,43,'dge',f='fdefe',k2=3)

二、函数的动态实参,可以将数组、字典或者元组中每一个元素单独传递

(一)*a将实参中的每一个元素单独传递,a直接将实参作为一个整体传递

def func(*args):
    print(args,type(args))
a = [1233,'dgreg',34,34]
func(a)     #([1233, 'dgreg', 34, 34],) <class 'tuple'>
func(*a)    #(1233, 'dgreg', 34, 34) <class 'tuple'>

(二)**a将实参字典中的每一个元素单独传递

def func(**kwargs):
    print(kwargs,type(kwargs))
a = {'k1':'a','k2':'b'}
func(k1=a)     #{'k1': {'k1': 'a', 'k2': 'b'}} <class 'dict'>
func(**a)    #{'k1': 'a', 'k2': 'b'} <class 'dict'>