python中def func(*args, **kwargs)

在python的函数中经常能看到输入的参数前面有一个或者两个星号,例如:

def fun1(param1, *param2):
def fun2(param1, **param2):
def fun3(param1, *param2, **param3)

*args, **kwargs 其实都是用来将任意个数的参数导入到python函数中。

具体而言:

1、*args:将多个输入打包成元组输入函数中

def fun(param1, *param2):
    print(param1)
    print(param2)
if __name__ == '__main__':
    fun(1,2,3,4,5)
---------------
out:
1
(2, 3, 4, 5)

分析:

(1) 由于形参param1只能接收一个实参,所以param=1被导入函数fun中

(2) 剩下的输入2,3,4,5被打包成元组赋给param2,所以*param2前面的*号表示这是一个元组,可以理解为是一个标志,便于编译器理解。如果没有这个*号,编译器会默认将数值2赋给param2,而不是(2,3,4,5)

注意:

(1) 在子函数中,param2就变成了独立的变量了,不需要*号作为标志。可以作为元组正常索引。

(2) 由上例知道*args是可变长度的,这也是其优点之一

2、**kwargs:将多个输入打包成字典输入函数中

def fun2(param1, **param2):
    print(param1)
    print(param2)
if __name__ == '__main__':
    fun2(1,a=2,b=3)
------------------------------
out:
1
{'a': 2, 'b': 3}

分析:

(1) 由于形参param1只能接收一个实参,所以param=1被导入函数fun中

(2) 剩下的输入a=2,b=3 被打包成字典赋给param2,所以**param2前面的*号表示这是一个字典,可以理解为是一个标志,便于编译器理解。

注意:

(1) 在子函数中,param2就变成了独立的变量了,不需要**号作为标志。可以作为字典正常索引。

(2) 由于**kwargs是字典类型,所以实参在输入的时候,要有字典所需要的key-value即键值对,不能单单输入数值

(3) 由上例知道**kwargs是可变长度的,这也是其优点之一

3、例子

注意点:参数arg、*args、**kwargs三个参数的位置必须是一定的。必须是(arg,*args,**kwargs)这个顺序,否则程序会报错。

def fun3(a, b=9, *args, **kwargs):
    print(a)
    print(b)
    print(args)
    print(kwargs)
if __name__ == '__main__':
    fun3(1, 2, 3, 4, c=5, d=6, e=7)
--------------------------------
out:
1
2
(3, 4)
{'c': 5, 'd': 6, 'e': 7}

4、主函数和子函数中的不同作用

上述的单星号用于子函数的输入,这里用于主函数中输入实参的操作中,作用是解压参数列表:

def fun4(a, b):
    print(a)
    print(b)

if __name__ == '__main__':
    input = [1, 2]
    fun4(*input)
-----------------------
out:
1
2

注意:子函数的形参个数要与解压之后数据的长度保持一致

同理,**kwargs也有类似用法,但是由于字典有key-value对,所以用法稍微有些不同。不同点在于:主函数中**用来解压,子函数中**用来做字典的标志。不同位置含义不同

def fun4(**kwargs):
    print(kwargs['a'])
    print(kwargs['b'])
    for key, value in kwargs.items():
        print(key)
        print(value)

if __name__ == '__main__':
    input = {'a':1,'b':2}
    fun4(**input)
-------------------
1
2
a
1
b
2

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值