python中的不定参(*args和**kargs)用法

*args和**kargs通常在装饰器中使用,是python中重要的内容,记录一下自己学习python的心得吧
【函数声明】里面的形参:  

先看一个星星的:
def fun(*args):
    print(args)


fun(1, 2, 3)

结果如下:

(1, 2, 3)

总结:在调用fun函数时,传入了3个参数,即1,2,3过去。fun函数声明时候,定义了一个叫*args的形参(args不是固定写法,约定俗成吧)那么传过去的1,2,3就被args这个参数接收了,按照正常理解,传过去3个东西,就应该要有3个形参(变量)接收,但是现在只有一个,说明args多半是个能装多个数据的数据结构,在python这里是一个元组。

【一个星的简单例子】:

        假设我们需要一个,可以实现【任意】个数字的求和的函数(这里暂不考虑入参格式校验和内置的sum函数)。那么我们就就要纠结了,如果数字个数确定的话,很好办。个数是几,我们在定义函数时候,定义对应数量的形参就好了,然后在函数体里面把几个参数相加并返回即可。现在你不能确定传过来的实参到底有几个,这个时候,我们这个*args就排上用场了。

def fun(*args):
    temp_sum = 0
    for num in args:
        temp_sum+=num
    return temp_sum


rlt = fun(1, 2, 3)
print(rlt)

运行结果是:6

再来看两个星星的:

def fun(**kargs):
    print(kargs)


fun(a=1,b=2,c='china',d=True)

结果如下:

{'a': 1, 'b': 2, 'c': 'china', 'd': True}

总结:两个星星,**kargs的这种不定参。传参时,只能传key=val这类的键值对参数(暂不考虑解包那种形式)。在函数内部,kargs是一个字典形式的数据,其元素是传过来的键值对参数。

如果传的是常规的位置参数,则会报错:

def fun(**kargs):
    print(kargs)


fun(1, 2, [], {})

结果如下:

    fun(1, 2, [], {})
TypeError: fun() takes 0 positional arguments but 4 were given

以上就是在函数声明(定义)时候一个星星和2个星星的用法了,简单总结一下就是:

 1. 一个星星,表示传进来的实参都传到它里面去(在该函数里是个元组形式)

 2. 两个星星,只有键值对那种实参才会传到它里面去(在该函数里是个字典形式)

下面讲一下函数调用时的实参

有以下一个函数:

def fun(*arg, **kargs):
    print(arg)
    print(kargs)

根据上面讲的函数形参里面一个星和2个星的用法,大家应该能看懂上面这个函数,那再看一下下面的函数调用吧

mylist = [1, 2, 3]
mytuple = (4, 5, 6)
mydict = {'a': 1, 'b': 'b'}
myset = {'c', 'd'}

fun(*mylist, **mydict)

输出结果是什么?

(1, 2, 3)
{'a': 1, 'b': 'b'}

为什么会这样?那是因为,在函数调用时候,如果用了星星符号,那这个时候就是在解包了。解包可以理解为,把数据一个一个拿出来。mylist 是个列表,解包之后就是3个数,1,2,3。它被*arg接收了,所以输出结果里面是(1,2,3)如果不明白这一步,再去看看上面的内容吧。至于mydict,它是一个字典,字典是典型的k-v数据结构,所以,它被**kargs接收了。输出结果里面是{'a': 1, 'b': 'b'}。

原有的代码不变,那么如果我是这样调用,那么函数的输出结果是多少呢?输出结果放在最后,看是不是和你预料的一样吧。

fun(*mytuple, **myset)

鉴于编者水平有限,上述内容如有不对之处,还望读者不吝指出。谢谢

结果:

(4, 5, 6, 'c', 'd')
{}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值