根据前面的讲解,我们都知道了,在定义函数的时候根据需求指定参数的个数和类型,但是有时候如果无法确定参数的个数呢?

举例说明:上一小节我们写过一个求两个整数之和的函数,但是在实际的开发中,也会经常遇到这样的情况,就是项目经理(对整个项目的进度进行把控,对程序员进行管理的人员,称为项目经理),要求你写一个函数,实现整数的和。在这个要求中,项目经理并没有说清楚到底是有几个整数,那么我们应该怎样确定该函数的参数呢?就用接下来给大家讲解的“不定参数列表”来解决这个问题

那么我们可以通过如下的方式来定义函数:

Test()函数的参数名字叫args(参数的名字可以随便起),类型是整型的。但是,大家一定要注意,在args后面跟了三个点,就是表示该参数可以接收0或多个整数值。所以,args这个参数我们可以想象成是一个集合(类似数学中集合),可以存放多个值。

所以,在Test()函数内,我们通过以前学习的一个函数叫len(),来计算出args这个集合中存储了多少个数(如果args这个集合中存储了5个数,那么len()函数的值就是5),通过for循环将该集合中的数全部输出,在输出时我们通过下标的方式将args集合中的值输出的。所谓的下标,我们可以理解成就是一个编号,对存储在args这个集合中每个数字都加上了编号。在这里要注意的是:下标是从0开始计算的。如下图所示:

args集合中存储了5,6,7三个数,对应的下标(编号),分别是0,1,2. 如果该集合中存储了4个数,那么第4个数的编号就是3.

现在取出第一个数就是args[0]值为5,第二个数args[1]值为6,以此类推。

 

在main()函数中,我们分别调用了三次Test()函数,在第一次调用时,我们只传递了一个参数1,那么形参args中也就只有1,所以只循环了一次就将该值输出。第二次调用时,传递了两个参数,循环两次输出,第三次调用,传递了三个参数,循环了三次输出。

 

在Test()函数中,我们除了使用len()函数,计算出集合中存储的数据的个数,然后再输出以外,还有另外一种输出的方式就是使用range关键字。如下所示:

range会从集合中返回两个数,第一个是对应的坐标,赋值给了变量i,第二个就是对应的值,赋值了变量data

所以以上两种输出集合的方式,大家在以后的开发过程中都可以使用。

 

当然在使用不定参数时,要注意几个问题:

第一:一定(只能)放在形参中的最后一个参数。例如:

上面我们定义了一个Test()函数,该函数第一个参数是一个普通的整型类型,第二个参数是不定参数。那么不定参数args,必须放在后面,整型类型的参数a必须放在前面.如果两者的位置进行互换,如下所示:

在编译的时候就会出错,出现的错误信息如下:

 

可能有同学会问,如果我现在根据需求,定义一个函数能够确定出两个具体的参数,类型是整型的,但是无法确定出其它参数的个数,那么该函数在定义的时候,是否是将两个能确定的整型参数放在前面,不定参数放在最后呢?是的,如下所示:

只要大家记住,不定参数一定要放在最后。

第二:在对函数进行调用时,固定参数必须传值,不定参数可以根据需要来决定是否要传值。

示例如下:

我们定义了一个Test()函数,该函数需要两个固定参数,和不定参数,在main()函数中,我们对Test函数进行了调用,实参1,2这两个值分别传递给形参中的a和b,实参中的3,5,6传递给了不定参数。

但是如果我们在调用Test()函数时,一个参数都不传递,那么会出错。例如:

出现的错误信息如下:

 

但是,如果Test()函数只有不定参数,没有固定参数,那么在调用时,可以根据需要来决定是否进行传值。例如:

我们在调用Test()函数时,没有传递任何的参数,程序并没有出现任何的错误,当然也没有输出结果。

 

最后我们来实现一下,一开始提出的“写一个函数,实现整数的和”这个问题,这个函数现在实现起来就非常简单了。

在以上的案例中,我们用到了一个下划线( _ ),该下划线表示匿名变量,丢弃数据不进行处理,也就是任何赋予它的值都会被丢弃。

在前面讲解的时候,我们只是说过匿名变量的语法,没有讲解其应用的场景,那么大家可以通过该案例体会出匿名变量的应用场景。