可变参数适用于我们在传入函数参数的时候,不确定传入的参数数量情况下。
每个语言都实现了这个功能。下面来看下各个语言的写法:
c/c++的写法
#include <stdio.h>
#include <stdarg.h>
double average(int num,...)
{
va_list valist;
double sum = 0.0;
int i;
/* 为 num 个参数初始化 valist */
va_start(valist, num);
/* 访问所有赋给 valist 的参数 */
for (i = 0; i < num; i++)
{
sum += va_arg(valist, int);
}
/* 清理为 valist 保留的内存 */
va_end(valist);
return sum/num;
}
int main()
{
printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5));
printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15));
}
java的写法
public class Args {
public static void main(String[] args) {
getAverage(1,2,3);
}
public static void getAverage(int... nums) {
int sum = 0;
for (int num: nums) { //同c语言不同,这里nums直接当做数组用
sum += num;
}
double average = sum/nums.length;
System.out.printf("average is "+average);
}
}
go的写法
func getAverage(nums... int) {
sum := 0
for _, num := range nums { //这里nums也当做数组使用
sum += num
}
fmt.Printf("average is %d", sum/len(nums))
}
func main() {
getAverage(1,2,3)
}
python的写法
def total(a=5, *numbers, **phonebook):
#*args 称作为数组参数,**kwargs 称作为字典参数,也就是说带*的参数可以视作数组,带**的参数视作字典
print('a', a)
# 遍历元组中的所有项目
for single_item in numbers:
print('single_item', single_item)
# 遍历字典中的所有项目
for first_part, second_part in phonebook.items():
print(first_part, second_part)
if __name__ == "__main__":
print(total(10, 1, 2, 3, Jack=1123, John=2231, Inge=1560))
总结对比:
- java、go、python传入可变参数后,函数的内部可以直接拿可变参数作为数组用,而c/c++的使用则稍微麻烦些,需要先进行转化。
- python比其他语言多了可以传入字典的功能;