5 各种参数使用之坑

Python强大多变,原因之一在于函数参数类型的多样化。方便的同时,也为使用者带来更多的约束规则。如果不了解这些规则,调用函数时,可能会出现如下一些语法异常:

(1) SyntaxError: positional argument follows keyword argument

(2) TypeError: f() missing 1 required keyword-only argument: ‘b’

(3) SyntaxError: keyword argument repeated

(4) TypeError: f() missing 1 required positional argument: ‘b’

(5) TypeError: f() got an unexpected keyword argument ‘a’

(6) TypeError: f() takes 0 positional arguments but 1 was given

总结主要的参数使用规则

位置参数

位置参数的定义:函数调用时根据函数定义的参数位(形参)置来传递参数,是最常见的参数类型。

def f(a):
  return a

f(1) # 位置参数

位置参数不能缺少:

def f(a,b):
  pass

f(1) # TypeError: f() missing 1 required positional argument: 'b'

规则1:位置参数必须一一对应,缺一不可

关键字参数

在函数调用时,通过‘键–值’方式为函数形参传值,不用按照位置为函数形参传值。

def f(a):
  print(f'a:{a}')

这么调用,a就是关键字参数:

f(a=1)

但是下面调用就不OK:

f(a=1,20.) # SyntaxError: positional argument follows keyword argument

规则2:关键字参数必须在位置参数右边

下面调用也不OK:

f(1,width=20.,width=30.) #SyntaxError: keyword argument repeated

规则3:对同一个形参不能重复传值

默认参数

在定义函数时,可以为形参提供默认值。对于有默认值的形参,调用函数时如果为该参数传值,则使用传入的值,否则使用默认值。如下b是默认参数:

def f(a,b=1):
  print(f'a:{a}, b:{b}')

规则4:无论是函数的定义还是调用,默认参数的定义应该在位置形参右面

只在定义时赋值一次;默认参数通常应该定义成不可变类型

可变位置参数

如下定义的参数a为可变位置参数:

def f(*a):
  print(a)

调用方法:

f(1) #打印结果为元组: (1,)
f(1,2,3) #打印结果:(1, 2, 3)

但是,不能这么调用:

f(a=1) # TypeError: f() got an unexpected keyword argument 'a'

可变关键字参数

如下a是可变关键字参数:

def f(**a):
  print(a)

调用方法:

f(a=1) #打印结果为字典:{'a': 1}
f(a=1,b=2,width=3) #打印结果:{'a': 1, 'b': 2, 'width': 3}

但是,不能这么调用:

f(1) TypeError: f() takes 0 positional arguments but 1 was given

接下来,单独推送分析一个小例子,综合以上各种参数类型的函数及调用方法,敬请关注。