在python 中,通常一个函数是具有两种参数,一个是形式参数,简称形参,还一个参数是发生在函数调用的时候的参数,我们通常简称为实参,而实参是可以传入任何数值,那么如果传入的形参是一个元组,或者是一个有序序列,那么在python中可以叫做封包,从字面意思可以理解为把一个序列封装到一个变量,序列里是可以有多元素的。封包的意义就不说了,直接说不定长形参的问题吧。
不定长形参的使用需求是出于提高函数的扩展性,例如,如果给定一个函数,求n个数的乘积,那么一般的情况下,形参和实参是一一对应的,也就是说n个形参对应n个实参,并且形参类型与实参类型也需要一致,否则函数报错,通常提示为参数不符合。例如下面的代码 ,这个代码是错误的:
def multiply(a,b):
nums=ab
return nums
print(multiply(3,4,5))
print(multiply(3,4,5))
报错:TypeError: multiply() takes 2 positional arguments but 3 were given
或者是这样的实参少一个参数
def multiply(a,b):
nums=ab
return nums
print(multiply(4))
报错:TypeError: multiply() missing 1 required positional argument: ‘b’
那么有没有一种方法形参不定,实参随意的方法来实现呢,也就是说,让这个方法的扩展性更好。当然有,定义一个不定长形参,那么就一切解决了。
直接上代码:
def multiplyer(args):
nums=1
for i in args:
print(type(args),args)
nums=numsi
return nums
#multiplyer(3,4,5)
print(multiplyer(33,44))
print(multiplyer(33,44,55))
print(multiplyer(33,44,‘a’))
有人可能会有疑问,为什么是for循环呢,因为我们是将实参封包成了一个元组传递到了形参,而在for循环里,做的是我们需要的运算操作,并且,每一次循环都打印我们是循环的什么东西以及循环的东西的值,如果运行这个方法,那么你会发现,print(type(args))返回给你的是 tuple,亦即元组。那么通过下标单独取值,遍历元组这些操作你也可以做了,通过操作这个元组 ,你可以影响这个方法的形参,这就是不定长形参的意义。