可变长参数

可变长参数

可变长参数:指的是在调用函数时,传入的参数个数可以不固定
调用函数时,传值的方式无非两种,一种是位置实参,另一种是关键字实参,因此形参也必须得有两种解决方法,以此来分别接收溢出的位置实参(*)与关键字实参(**)

一、可变长实参之*

# 可变长参数*
# *args会接受多于的位置实参,尽量不使用其他的变量名,而应该使用args,args是约定俗称

def func(name, pwd, *args):
    print('name:', name, pwd, )
    print(args)
    return 1

res = func('randy', 123, 'a', 1, 3)
print(res)

结果:

('a', 1, 3)
1

二、可变长形参之**

形参中的会将溢出的关键字实参全部接收,然后存储字典的形式,然后把字典赋值给后的参数。需要注意的是:**后的参数名约定俗成为kwargs。

# 可变长参数 **
# kwargs会接收多余的关键字实参,以字典形式存储
def func(name, pwd, **kwargs):
    print('name', name, 'pwd', pwd)
    print(kwargs)
    return 1


res = func('randu', 1234, a=2, b=4)
print(res)

结果:

{'a': 2, 'b': 4}
1

三、 可变形参*之*(a,b,c)

*会把元组打撒成位置实参传给形参


def func(name, pwd, x, y, z):
    print(name, pwd, x, y, z)
    return 1


tup = (1, 2, 3)
print('randy', 12, *tup)  # *会把元组打撒成位置实参传给形参

结果:

randy 12 1 2 3

四、可变形参**之**({‘a’:1, ‘b’:3})

实参中的会将后参数的值循环取出,打散成关键字实参。以后但凡碰到实参中带的,它就是关键字实参,应该马上打散成关键字实参去看。

def func(name, pwd, **kwargs):
    
    print(name, pwd)
    print(kwargs)
    return 1

dic = {"a": 1, 'b': 3}
res = func('2', 3, **dic)  # 会把字典打散成关键字实参传给形参

结果:

2 3
{'a': 1, 'b': 3}

五、命名关键字形参

现在有一个需求:函数的使用者必须按照关键字实参传。

def register(x, y, **kwargs):
    if 'name' not in kwargs or 'age' not in kwargs:
        print('用户名和年龄必须使用关键字的形式传值')
        return
    print(kwargs['name'])
    print(kwargs['age'])


register(1, 2, name='randy', age=19)

randy
19

命名关键字形参:在函数定义阶段,*后面的参数都是命名关键字参数。

特点:在传值时,必须按照key=value的方式传值,并且key必须命名关键字参数的指定的参数名。

def register(x, y, *, name, gender='male', age):
    print(x)
    print(age)

# * 后面必须以关键字传参
register(1, 2, x='randy', age=19)  # TypeError: register() got multiple values for argument 'x'

六、总结

  1. 可变长参数*:args接受多于的位置实参,尽量不使用其他的变量名,而应该使用args,args是约定俗称;
  2. 可变长参数**:kwargs会接收多余的关键字实参,以字典形式存储;
  3. 可变实参(1,2,3):通过 *打散元组成位置实参传递给位置形参;
  4. 可变实参{‘a’:1, ‘b’:3}: 通过**打散字典成为关键字实参,传递给形参;
  5. *:后面的参数都要以关键字实参进行传递;
在当下的阶段,必将由程序员来主导,甚至比以往更甚。
原文地址:https://www.cnblogs.com/randysun/p/12239981.html