# 可变长参数
# 站在调用函数传递实参的角度 实参的个数不固定的情况# 也就意味形参也不固定# 站在形参的角度 可以用*和**来接收多余的(溢出的)位置参数和关键字参数# 站在形参的角度 看 *
# 形参中的*会将多余的(溢出的)位置实参 统一用元组的形式处理 传递给*后面的形参名# def func(x,y,*z):# print(x,y,z) # z = (3, 4, 5, 6, 7, 8, 54, 43, 4, 5, 6, 6, 7, 8)# func(1,2,3,4,5,6,7,8,54,43,4,5,6,6,7,8,)# 站在实参的角度 看 *
# def func(x,y,z):# print(x,y,z)# # l = [1,2,3]# # a,b,c = l# # func(a,b,c)# # func(*[1,2,3,4,5,6]) # *会将列表打散成位置实参一一传入等价于func(1,2,3,4,5,6)# func(*(1,2,3)) # 等价于func(1,2,3)# def func(x,*z):# print(x,z)# func(1,*{1,2,3}) # *在形参中只能接收多余的位置实参 不能接收关键字实参# *只能将列表 元组 集合 字符串# *的内部你可以看成是for循环
# 站在形参的角度看 **
# def func(x,y,**z):# print(x,y,z) # z = {'z': 1, 'a': 1, 'b': 2, 'c': 3}# func(x=1,y=2,z=1,a=1,b=2,c=3)# **会接收所有多余的关键字参数 并将关键字参数 转换成字典的形式 字典的key就是关键字的名字# 字典的value就是关键字的名字指向的值 将字典交给**后面的变量名 # 站在实参的角度看 **def func(x,y,z): print(x,y,z)# func(12,3,4)# func(x=1,y=2,z=3)# d = {'x':1,'y':2,'z':333}# func(x=1,y=2,z=3)# func(**d) # 等价于func(x=1,y=2,z=333)# **会将字典拆封成 key = value的形式
"""总结 * 与 ** *在形参中能够接受多余的位置参数 组织成一个元祖赋值给*后面的变量名 **在形参中能够接受多余的关键字参数 组织成一个字典赋值给**后面的变量名 *:在实参中 *能够将列表 元祖 集合 字符串 打散成位置实参的形式传递给函数 (*就看成是for循环取值) **:在实参中 能将字典打散成key = value的形式 按照关键字参数传递给函数"""
# 需求 你写的函数 无论调用者按照正确传参的方式无论怎么传 你的函数都能够正常执行
# def func1(*x,**y):# print(x,y)# func1(1,2,3,4,5,6,x=1,y=2,z = 3)"""
注意python推荐形参*和**通用的写法"""def func2(*args,**kwargs): print(args,kwargs)func2(1,2,3,4,5,6,x=1,y=2,z = 3)