在开发过程中,我们需要计算两个数的和,代码如下:
root@ubuntu:/home/python/codes/python基础-05# cat test.py #-*- coding:utf-8 -*- def sum_2_nums(a,b): result = a+b print("result=%d"%result) num1 = int(input("第1个数:")) num2 = int(input("第2个数:")) sum_2_nums(num1,num2) root@ubuntu:/home/python/codes/python基础-05# python3 test.py 第1个数:1 第2个数:2 result=3
但是如果我们想计算n个数的和,那么代码需要怎么写呢?
root@ubuntu:/home/python/codes/python基础-05# cat test.py #-*- coding:utf-8 -*- def sum_n_nums(a,b,*args): #在这里定义的函数中携带三个参数,a,b,args,那么这个*args是啥呢?表示都存放在*args,变量名任叫args,*代表着对python解释器说:如果传递的实参个数大于形参的个数,剩下的都给#args result = a+b for temp in args: result += temp print("result=%d"%result) sum_n_nums(11,22,33,44,55) root@ubuntu:/home/python/codes/python基础-05# python3 test.py result=165
让我们来具体的来看一下*args是什么东西:
root@ubuntu:/home/python/codes/python基础-05# cat test.py #-*- coding:utf-8 -*- def sum_n_nums(a,b,*args): #*args表示命名函数 print(a) print(b) print(args) sum_n_nums(11,22,33,44,55) root@ubuntu:/home/python/codes/python基础-05# python3 test.py 11 22 (33, 44, 55) #元组,也就是说*告诉python解释器,如果有多传进来的值,都交给*args,然后以元组的形式保存起来
root@ubuntu:/home/python/codes/python基础-05# cat test.py #-*- coding:utf-8 -*- def sum_n_nums(a,b,*args): print(a) print(b) print(args) sum_n_nums(11,22,33) root@ubuntu:/home/python/codes/python基础-05# python3 test.py 11 22 (33,) #这个是什么鬼,原来当元组只有一个参数的时候,需要在后面添加一个“,”号,整体才可以称为元组,否则别人也不知道这是什么东西
root@ubuntu:/home/python/codes/python基础-05# cat test.py #-*- coding:utf-8 -*- def sum_n_nums(a,b,*args): print(a) print(b) print(args) sum_n_nums(11,22) root@ubuntu:/home/python/codes/python基础-05# python3 test.py 11 22 () #因为在调用函数的时候只是传递了两个参数
字典形式参数
root@ubuntu:/home/python/codes/python基础-05# cat test.py #-*- coding:utf-8 -*- def sum_n_nums(a,b,*args,**kwargs): print(a) print(b) print(args) print(kwargs) sum_n_nums(11,22,33,name='xiaoyafei',age=19) #有的人可就纳闷了,怎么调用函数还有带变量名的,在这里解释一句,**kwargs是字典形式参数,如果传递了多余的参数,而多余的参数面前是不带变量名的,统统都给args,
否则都交给kwargs,并且是以字典的形式保存的
root@ubuntu:/home/python/codes/python基础-05# python3 test.py 11 22 (33,) {'name': 'xiaoyafei', 'age': 19}
总结
*args表示告诉python解释器这个变量可以保存没有名字的变量的值
**kwargs表示告诉python解释器可以保存实参里带有名字的参数
拆包
root@ubuntu:/home/python/codes/python基础-05# cat test.py #-*- coding:utf-8 -*- def sum_n_nums(a,b,c=33,*args,**kwargs): print(a) print(b) print(c) print(args) print(kwargs) A = [11,22,33] B = {"name":"laowang","age":20} sum_n_nums(11,22,33,*A,**B) root@ubuntu:/home/python/codes/python基础-05# python3 test.py 11 22 33 (11, 22, 33) {'name': 'laowang', 'age': 20}
拆包总结
1.如果想往函数里传递的是元组里的内容/字典里的内容,将来在调用的时候再元组前写上*,在字典面前写上**
2.*和**表示拆包,把元组拆成一个一个的值,把字典拆成一个一个的key value
3.如果没有写*和**,那么就会当成一个普通的值扔到args里
4.在实参里写入*和**表示拆包,把里面的值当做参数传递