Python不定参(收集参数* **)


 

不定参基础知识点

 
不定参—可接受数量不固定的参数,拥有扩展的能力。对于那些传入参数的数量不确定的程序有很重要的作用,但同时由于不定参可同时接受很多参数,这也带来了隐患—参数不合法。要解决这个问题就需要使用断言(assert)或者(try except)来增加对参数合法性的检验及参数不合法时的容错。

不定参有两种形式 * params和 * * params
1、* params 以位置参数的形式接受传入的参数,所有的参数存放在一个元组当中,传入参数的顺序即为元组中元素的顺序。不接受关键字传参的形式!
2、* * params以关键字参数的形式接受传入的参数,并将关键字参数以kv对的形式保存在一个字典中。不接受位置参数,仅接受关键字参数!
 
 

不定参配合位置参数

(位置参数, 不定参)

若不定参位于位置参数之后则传入的参数会按顺序先传入位置参数再将剩下的所有传入不定参,不会抛出仅接受关键字参数的异常。

def test( a ,*params_a):
    print(a)
    print(*params_a)
    print(params_a)
    for each in params_a:
        print(each)
    return params_a

a = test(1,2,3,4,5,6)
print(type(a))

若使用的不定参为* * params的形式则仅接受关键字传参,以位置参数的形式传入则会抛出异常(毕竟收集到的参数是存放在字典中,一定要有k才能有v),且传入的关键字参数不可重复(即不可自身重复,也不可与已有的形参名重复) 重复则抛出异常。

def test( a , **params_a):
    print(a)
    print(*params_a)
    print(params_a)
    for each in params_a:
        print(each)
    return params_a

a = test(1, aa=2, b=3, c=4, d=5, e=6)
print(type(a))

(不定参,关键字参数)

若不定参位于非不定参的前面,则后面的参数一定要使用关键字参数才可正常调用,否则将抛出却是仅关键字参数的异常。

def test( *params_a,a ):
    print(a)
    print(*params_a)
    print(params_a)
    for each in params_a:
        print(each)
    return params_a

a = test(1,2,3,4,5,6,a = 9)
print(type(a))

仅有* params的形式才可以将形参放置到不定参后面,* * params后若有形参则无法通过语法检测。


 
 

收集参数(不定参)的逆过程

 
上面讨论的收集参数是在形参中加入* 和 * *来达到收集参数的目的。那如果将 *用在实参中会怎么样呢?

如果有如下函数,求取4个值的和,那就需要对4个值分别传入。如下以元组的方式传入会抛出异常,提示缺少3个参数(此处将元组当作第一个参数了)

def ad(a, b, c,d ):
    return a+ b+c+d

a = (1,2,3,4)
res = ad(a)
print(res)

但是若以如下的方式传入则可正常运行。即在实参中以*参数的形式传入会将传入的序列(元组、列表、集合、字符串)拆分为单个的参数传入。参数的数量要对应,过多的参数和过少的参数都会抛出异常。

def ad(a, b, c,d ):
    return a+ b+c+d

a = (1,2,3,4)
res = ad(*a)
print(res)

当函数的形参以**para的形式收集关键字参数时,需要给以关键字参数的形式传入实参。 此时若有一个字典,又不想对其解析之后再传入即可 使用 * *字典的形式,python解释器会自动将此字典拆分为多个kv对传入。

posted @ 2022-06-05 20:49  阿伦alun  阅读(403)  评论(0编辑  收藏  举报