*args

  1. 不定长参数args是arguments的缩写,表示位置参数
  2. 支持0个参数,1个参数,N个参数
  3. *args:这个函数的形参可以接受任意数量的位置参数,存储方式是元组类型
def a(*args):

    print(args)
    print(type(args))  # <class 'tuple'>

a() # 输出结果为:()
a(1) # 输出结果为:(1,)   因为括号()既可以表示tuple,又可以表示数学公式中的小括号,所以当只有1个元素的tuple定义时必须加一个逗号,来消除歧义
a(1,2,3,4,5) # 输出结果为:(1, 2, 3, 4, 5)

位置参数结合*args的使用

  1. 不定长参数一般结合位置参数一起使用
  2. 位置参数会接受对应的实参,而且有序接收
  3. 其他位置参数之后的不定长参数全部被*args接收
def a(x,y,*args):
    print(x,y,args)

# a() # 当设置了位置参数,则必须要输入位置参数的值 TypeError: a() missing 2 required positional arguments: 'x' and 'y'
a(1,2) # 输出结果为:1 2 () 不输入不定长参数,则返回一个空元组
a(1,2,3) # 输出结果为:1 2 (3,) 不定长参数依旧使用tuple方式进行储存
a(1,2,3,4,5,6) # 输出结果为:1 2 (3, 4, 5, 6)

**kwargs

  1. kwargs是keyword arguments的缩写,表示关键字参数
  2. 使用**kwargs可以接受0-任何的关键字参数,储存数据类型是字典
def a(**kwargs):
    print(kwargs)
    print(type(kwargs))  # <class 'dict'>

a() # 输出结果为:{}
a(name="张三") # 输出结果为:{'name': '张三'}
a(name="张三",age=18,weight=60,score=98.5) # 输出结果为:{'name': '张三', 'age': 18, 'weight': 60, 'score': 98.5}
  1. 在Python中默认的函数参数顺序是:必选参数、默认参数、*args和**kwargs
def a(x, y=222, *args, **kwargs): # x为必选参数,y为默认参数
    print(x,y,args,kwargs)

a(1) # 输出结果为:1 222 () {} 可以只将必选参数的实参写入,此时y读取默认参数
a(1,333) # 输出结果为:1 333 () {}  当写入两个实参时,会默认认为第二个实参为y的值
a(1,333,44,55) # 输出结果为:1 333 (44, 55) {} 当输入多个实参时,没有输入字典类型的值则默认为从第三个开始全部为args的对应值
a(1,333,44,55,name="张三",age=18) # 输出结果为:1 333 (44, 55) {'name': '张三', 'age': 18}
a(1,333,44,55,name="张三",age=18,666) # 输出结果为:SyntaxError: positional argument follows keyword argument 一旦输入了kwargs的值后则无法再输入args的值了,因为python语法规定:位置参数放在关键字参数的前面