这么多名称,python到底有几种参数:
2种:普通参数(即位置参数,靠位置先后来指定参数),关键字参数(即命名参数,靠名字来指定参数)。
常说的可变参数也就是普参的集合,*args。
常说的关键字参数一般指关键字参数集合,**kwargs。
参数优先级:普通参数(位参)> 普参集 > 关键字参数 > 关参集:
def add(a, *args, b=2, **kwargs):
print('a:', a)#普通参数
print('args:', args)#普参集
print('b:', b)#关键字参数,在定义函数时使用就是默认参数
print('kwargs:', kwargs)#关参集
add(1, 2, 3, b=4, c=5, d=6)
输出>>a: 1
args: (2, 3)
b: 4
kwargs: {'c': 5, 'd': 6}
具体如下:
形参:形式参数:parameter;(在定义函数时指定的参数形式,区别于实参,跟位参关参等不在一个维度。如:
def add(a,b): #这里的a,b为形参(换个维度也可以称为位置参数)
return a+b
实参:实际参数(或直接称参数,以下同理):argument(简:arg,复:args);(在调用函数时指定的参数值,如:
c = add(1, 2) #这里的1,2为实参(换个维度也可以称为位置参数)
参考:
默认参数:形参里的关键字参,如
def c(a=1, b): #a为默认参,b为位参
pass
可变参数:即可选参数,即参数集,如*args,**kwargs, 即调用函数时可随意填入*args,**kwargs中的0个或多个,具体参考下文。
普通参数:即位置参数,最普通常用的参数形式, 区别于关键字参数,顾名思义,是靠位置来明确参数指定的。即不靠名字标识符,就一个光杆。
位置参数集:把位参打包,放入*args元组;(args只是名称,可换成其他任意合法标识符,如:*my_args)
def c(*my_argsss): #类型被指定为元组
print(type(my_argsss))
c(1,2)
输出>><class 'tuple'>
c(1)
输出>><class 'tuple'>
命名实参:关键字参数:keyword_argument(简:kwarg,复:kwargs);(区别于位参,关参靠名字来指定参数,在定义函数和调用函数的时候指定了名字(标识符),如:
def add(a, b=1): #a为位参,b为默认参(注意顺序,不能把位参放到关键参后面)
return a+b
add(2, b=5) #调用的时候,b=5就是关键参,这里b为标识符(identifier)
def c(**k):
print(type(k)) #类型被指定为字典
c(a=1, b=2) #a,b为标识符
输出>><class 'dict'>
c(**{'a':1,'b':2})
输出>><class 'dict'>
c({'a':1,'b':2})
输出>>TypeError: c() takes 0 positional arguments but 1 was given(类型错误:c()未定义位置参数,但接收到了 1 个位置参数)
#{'a':1,'b':2}被当成一个参数,这个参数是字典,这个字典没有标识符,所以是位参;
#**{'a':1,'b':2}被解析成多个参数,参数是字典里的key=value,标识符为key,实参为value
命名实参集:关键字参数集:**kwargs;(kwargs只是名称,可换成其他任意合法标识符,如:**some_kws。具体如下:
def add(a, b):
return a + b
add(a=1, b=2)
输出>>3
add(**{'a':1,'b':2})
输出>>3
def add(**k):
return k['a']+k['b']
add(a=1,b=2)
输出>>3
add(**{'a':1,'b':2})
输出>>3