1. ’ * ’ 的作用

  • 用在动态参数前,打包多个参数并将其转化为元组
def func(*args):
    print(args)
 
func(1, 2, 3)  # (1, 2, 3)

输入参数为1, 2, 3,最后返回的结果是一个元组 (1, 2, 3)

  • 用在可迭代对象前,进行自动解包转化为多个单变量参数
def func(a, b, c):
    print(a, b, c)
 
args = [1, 2, 3]
func(*args)  # 1 2 3

输入参数为一个列表[1, 2, 3],解释器自动进行解包然后分别传递给3个变量。

2. ’ ** ’ 的作用

  • 用在动态参数前,打包多个赋值形式的参数并将其转化为字典
def func(**kwargs):
    print(kwargs)
 
func(a=1, b=2, c=3)  # {'a': 1, 'b': 2, 'c': 3}

函数接收类似于关键参数一样赋值形式的多个实参,并返回一个字典。

  • 用在字典前,解包字典中的数据项作为键值参数传给函数
def func(a, b, c):
    print(a, b, c)
 
kwargs = {'a': 1, 'b': 2, 'c': 3}
func(**kwargs)  # 1 2 3

3. 参数类型

  • 位置参数

所有参数的顺序必须一一对应,且数量一致。

def func(a, b, c):
    print(a, b, c)
 
func(1, 2, 3)  # 1 2 3
  • 关键字参数

函数调用通过键值对形式加以指定。关键字参数之间不存在先后顺序;有位置参数时,位置参数必须在关键字参数的前面。

def func(a, b, c):
    print(a, b, c)
 
func(a=1, b=2, c=3)    # 1 2 3
func(b=2, c=3, a=1)    # 1 2 3
func(4, b=5, c=6)      # 4 5 6
# 错误的调用方式
func(a=4, b=5, 6)      # SyntaxError: positional argument follows keyword argument
  • 默认参数

为参数提供默认值,调用函数时可传可不传。所有位置参数必须放在默认参数前面。

# 正确的定义方式
def func(a, b=2):
    print(a, b)
 
func(1)     # 1 2
func(1, 3)  # 1 3
 
# 错误的定义方式
def func(a=1, b):
    print(a, b)  # SyntaxError: non-default argument follows default argument

4. ’ *args ’ 与 ’ **kwargs ’

定义函数时,如果不确定调用的时候会传递多少个参数,可以打包位置参数或者关键字参数来进行参数传递。

  • 位置传递
def func(*args):
    print(args)
 
func(1)        # (1,)
func(1, 2)     # (1, 2)
func(1, 2, 3)  # (1, 2, 3)
  • 关键字传递
def func(**kwargs):
    print(kwargs)
 
func(a=1)            # {'a': 1}
func(a=1, b=2)       # {'a': 1, 'b': 2}
func(a=1, b=2, c=3)  # {'a': 1, 'b': 2, 'c': 3}

注意:***只有在传参时才有用。

# 错误的使用方法
args = (1,2,3)
a, b, c = *args  # SyntaxError: can't use starred expression here

5. 参数混合使用

函数定义和调用时的参数类型必须一致;位置参数放在*args参数前,*args参数放在**kwargs参数前,**kwargs参数放在最后。

# 位置参数 默认参数 *args **kwargs
def func(a, b, c=0, *args, **kwargs):
    print(a, b, c, args, kwargs)
 
func(1, 2, m=7, n=8)              # 1 2 0 () {'n': 8, 'm': 7}
func(1, 2, 3, 4, 5, 6, m=7, n=8)  # 1 2 3 (4, 5, 6) {'m': 7, 'n': 8}
 
# 位置参数 *args 默认参数 **kwargs
def func(a, b, *args, c=0, **kwargs):
      print(a, b, c, args, kwargs)
 
func(1, 2, 3, 4, 5, 6, m=7, n=8)       # 1 2 0 (3, 4, 5, 6) {'m': 7, 'n': 8}
func(1, 2, 3, 4, 5, 6, c=9, m=7, n=8)  # 1 2 9 (3, 4, 5, 6) {'m': 7, 'n': 8}