一、函数的可变长参数
- 可变长参数:指的是在调用函数时,传入的参数个数可以不固定
- 可变长参数其实就是用来分别接收溢出的位置实参*,关键字实参**
1.可变长形参之*
- 形参中的*会将溢出的位置实参全部接收,以元组的形式,然后把元组赋值给*后的参数。
- *后的参数名约定俗成为args。
def fun(name,age,*args):# args 是用来接收多出来的对应的位置实参的,并用元组的形式存储的
print(name,age)# xichen 20
print(args)# (170, 100)
fun('xichen',18,170,100)
2.可变长形参之**
- 形参中的*会将溢出的位置实参全部接收,以字典的形式存储,然后把字典赋值给**后的参数。
- **后的参数名约定俗成为kwargs
def fun(name,age,**kwargs):
print(name,age)# xichen 20
print(kwargs)# {'height':170,'weight':100}
fun('xichen',20,height=170,weight=100)
3.可变长实参之*
- 实参中的*,*会将*后参数的值循环取出,打散成位置实参。
- 但凡碰到实参中带*的,它就是位置实参,应该马上打散成位置实参去看。
def fun(name,age,hight,wight):
print(name,age)# xichen 20
print(args)#(170,100)
args = (170,100)
fun('xichen',20,*args)
4.可变长实参之**
- 实参中的**,**会将**后参数的值循环取出,打散成位置实参。
- 但凡碰到实参中带**的,它就是位置实参,应该马上打散成位置实参去看。
def fun(name,age,height,weight):# 位置形参接收关键字实参的变量名必须和kwargs字典里的key一样
print(name,age)# xichen 18
print(kwargs)# {'height': 170, 'weight': 100}
kwargs = {'height':170,'weight':100}
fun('xichen',20,**kwargs)
5.可变长参数应用
def index(name, age, sex):
print(f"name: {name}, age: {age}, sex: {sex}")
def wrapper(*args, **kwargs):
print(f"args: {args}")# args: ()
print(f"kwargs: {kwargs}")# kwargs: {'name': 'nick', 'sex': 'male', 'age': 19}
index(*args, **kwargs)# name: nick, age: 19, sex: male
wrapper(name='nick', sex='male', age=19)
6.命名关键字形参
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='nick', age=19)
- 在函数定义阶段,*后面的参数都是命名关键字参数。
- 在传值时,必须按照key=value的方式传值,并且key必须命名关键字参数的指定的参数名。
def register(x, y, *, name, gender='male', age):
print(x)
print(age)
register(1, 2, x='nick', age=19)