python 参数笔记 --> 位置参数 关键字参数 命名参数 形式参数 默认参数 可变参数 可选参数 位置顺序

这么多名称,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
原文地址:https://www.cnblogs.com/oler/p/13532641.html