函数的动态传参
*args 将所有的实参的位置参数聚合到一个元组,并将这个元组赋值给args
有些时候,对于函数,传入的实参数量可能是不固定的,也就是动态的,这个时候我们就需要用到函数的动态传参。下面举个个列子,我需要一个函数,无论我给他任意个数字参数,他都能返回我所有数字的和。
def count(*args): sum0 = 0 for i in args: sum0 += i return sum0 print(count(1,2,3,4,5)) #运行结果:15
这样无论我在函数count中输入多少个数字,都能返回和。*args就是动态传参,实质上是函数会将接受到的值打包成元祖的形式赋值给args,不信你可以在函数值用type去判断。总结:*在函数的定义时,在 *位置参数,聚合
**kwargs 将所有的关键字实参作为字典的键值对聚合到一个字典,并赋值给kwargs
有时候,需要接受任意数量的实参,但预先不知道传递给函数的会是什么样的信息。在这种情况下,可将函数编写成能够接受任意数量的键 — 值对 —— 调用语句提供了多少就接
受多少。
def func1(**kwargs): print(kwargs) func1(name = 'king',age = 24) 运行结果:{'name': 'king', 'age': 24}
可以看出**是将接收到的关键字参数作为键值对赋值给,kwargs。
编写一个函数,将一辆汽车的信息存储在一个字典中。这个函数总是接受制造商和型号,还接受任意数量的关键字实参。这样调用这个函数:提供必不可少的信息,以及两个名称 — 值对,如颜色和选装配件。这个函数必须能够像下面这样进行调用:
car = make_car('subaru', 'outback', color='blue', tow_package=True)
分析要求,题目要求函数总是接受制造商和型号,也就是这2个参数是必须填的,我们可以设置成位置参数,而其他还接受任意数量的关键字实参。所以需要用到**方法:
def make_car(name,producter,**kwargs): dic = {} dic['车型'] = name dic['生产商']=producter for i in kwargs: dic[i] = kwargs[i] return dic car = make_car('subaru', 'outback', color='blue', tow_package=True) print(car) #运行结果: {'车型': 'subaru', '生产商': 'outback', 'color': 'blue', 'tow_package': True}
#如果只输入car = make_car('subaru', 'outback')
则会打印 {'车型': 'subaru', '生产商': 'outback'}
函数形参的顺序
位置参数,*args, 默认参数 **kwargs我们在定义形参时,必须遵循这样的原则位置参数,默认参数
def func(a,b,sex='男'): # print(a) print(sex) func(100,200,) 位置参数,*args, 默认参数 def func(a,b,*args,sex='男',): # print(a) print(a,b) print(sex) print(args) func(100,200,1,2,34,5,6)
位置参数,*args, 默认参数 **kwargs def func(a,b,*args,sex='男',**kwargs,): print(a,b) print(sex) print(args) print(kwargs) func(100,200,1,2,34,5,6,sex='nv',name='alex',age=1000)