文章目录
- 1.个数可变的位置形参概念
- 2.定义函数时定义一个个数可变的位置形参
- 3.个数可变的形参通常位于函数中的最后一个形参
1.个数可变的位置形参概念
定义函数时,如果无法事先确定传递的位置实参的个数,在这种情况下,可以将形参定义为个数可变的位置形参,去接收0个或多个实参,传进来的多个实参最终会被转换成一个元组类型,赋值给形参变量。
所谓的个数可变的位置形参,指的就是这个形参可以接收n个传递的实参。
定义函数时,最多只能定义一个个数可变的位置形参,如果定义多个的话,即使传递再多的实参也都会传递给第一个个数可变的形参,所以不允许一个函数里定义多个个数可变的关键字形参。
在Python的内置函数中,很多函数都定义了个数可变的位置形参,例如print()函数就是典型的代表,我们可以使用print打印无数个任意的数据。在Pycharm中可以把鼠标放在函数上,摁Ctrl键即可跳转到函数的定义。
通常情况下,我们会把个数可变的位置形参定义为最后一个形参,以便接收所有剩余的位置实参。
如果个数可变的位置形参不是函数中的最后一个形参,那么该形参后面的其他形参都只能通过关键字进行传参,或者定义默认值,如果不这么做的话,多个位置实参都会被传递给个数可变的形参,从而就会导致个数可变的形参之后的其他形参没有具体的实参。
2.定义函数时定义一个个数可变的位置形参
定义函数时,最多只能定义一个个数可变的位置形参,如果定义多个的话,即使传递再多的实参也都会传递给第一个个数可变的形参,所以不允许一个函数里定义多个个数可变的关键字形参。
定义个数可变的形参非常简单,只需要在形参的前面添加一个*
号,与强制使用关键字传参的*
不同,这个*
号和是形参连在一起的。
#定义函数时,使用*定义一个个数可变的形参
def fun1(*args):
print(args)
fun1(1)
fun1(1, 2)
fun1('jiangxl', 1, 2)
第一次调用时,传递了一个实参,第二次调用时传递了两个实参,第三次调用时传递了三个实参,无论传递多少个实参都会被*args
个数可变的形参所接收,返回的结果是一个元组。
3.个数可变的形参通常位于函数中的最后一个形参
通常情况下,我们会把个数可变的位置形参定义为最后一个形参,以便接收所有剩余的位置实参。
def fun2(para1, para2, *args):
funformat = 'para1为:{}, para2为:{}, args为:{}'
print(funformat.format(para1, para2, args))
fun2('jenkins', 'gitlab', 1, 2, 3, 4, 5)
#输出结果:para1为:jenkins, para2为:gitlab, args为:(1, 2, 3, 4, 5)
将个数可变的形参定义再最后一个形参时,前面普通形参接收传递的对应实参,para1接收Jenkins,para2接收gitlab,其余所有的位置传参都会被最后一个个数可变的形参所接收,并且会将多个位置传参组合成一个元组。
如果个数可变的位置形参不是函数中的最后一个形参,那么该形参后面的其他形参都只能通过关键字进行传参,否则就会抛出异常,或者为后面的形参定义默认值。
如果不这么做的话,多个位置实参都会被传递给个数可变的形参,从而就会导致个数可变的形参之后的其他形参没有具体的实参。
def fun2(para1, *args, para3):
funformat = 'para1为:{}, para2为:{}, args为:{}'
print(funformat.format(para1, args, para3))
fun2('jenkins', 1, 2, 3, 4, 5, 'gitlab')
当前个数可变的形参不是位于函数中的最后一个形参,我们可能希望jenkins实参传给para1形参,1, 2, 3, 4, 5多个位置实参传给*args个数可变的形参,gitlab传给para3形参,但是gitlab并没有使用关键字进行传参,就会被认为也是传给了args个数可变的形参,从而导致para3形参没有对应的实参,最终抛出异常。
如下图所示,个数可变的形参不是函数体中最后一个形参,它会去接收除了para1实参外的所有位置实参,因此就会导致para3无实参值,从而就会抛出异常。
如果我们非要让个数可变的形参位于中间,那么个数可变的形参后面的形参,必须使用关键字传参。
fun2('jenkins', 1, 2, 3, 4, 5, para3 = 'gitlab')
#输出结果:para1为:jenkins, para2为:(1, 2, 3, 4, 5), args为:gitlab
或者将个数可变的形参后面的形参设置默认值。
def fun2(para1, *args, para3 = 'haha'):
funformat = 'para1为:{}, para2为:{}, args为:{}'
print(funformat.format(para1, args, para3))
fun2('jenkins', 1, 2, 3, 4, 5, 'gitlab')
#输出结果:para1为:jenkins, para2为:(1, 2, 3, 4, 5, 'gitlab'), args为:haha
通过这两种方法,都不会再抛出异常了。