08-不定长函数

在开发过程中,我们需要计算两个数的和,代码如下:

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.在实参里写入*和**表示拆包,把里面的值当做参数传递

原文地址:https://www.cnblogs.com/xiaoyafei/p/8556419.html