Python tips: 什么是*args和**kwargs?

转自:http://blog.csdn.net/yjk13703623757/article/details/76521420

今天,在查一个方法的帮助文档时,我发现函数参数是*args与**kwargs。

args是所有参数的数组,kwargs就不知道,google了一下,恍然大悟。kwargs就是传入的多个键值对key = value,运行结果为字典。

1. *args,**kwargs是什么?

例子:

def test(a, *args, **kwargs):
    print(a)
    # print(b)
    # print(c)
    print(args)
    print(kwargs)

test(1, 2, 3, d = '4', e = 5)

输出结果:

1
(2, 3)
{'e': 5, 'd': '4'}

即1是参数a的值,数组(2, 3)是args的值,kwargs表示在args之后多个键值对。kwargs对参数位置不敏感。

再看一个例子:

def foo(*args, **kwargs):
    print('args = ', args)
    print('kwargs = ', kwargs)
    print('---------------------------------------')

if __name__ == '__main__':
    foo(1, 2, 3, 4)
    foo(a = 1, b = 2, c = 3)
    foo(1, 2, 3, 4, a = 1, b = 2, c = 3)
    foo('a', 1, None, a = 1, b = '2', c = 3)

输出结果如下:

args =  (1, 2, 3, 4) 
kwargs =  {} 
--------------------------------------- 
args =  () 
kwargs =  {'a': 1, 'c': 3, 'b': 2} 
--------------------------------------- 
args =  (1, 2, 3, 4) 
kwargs =  {'a': 1, 'c': 3, 'b': 2} 
--------------------------------------- 
args =  ('a', 1, None) 
kwargs =  {'a': 1, 'c': 3, 'b': '2'} 
---------------------------------------

可以看到,*args和**kwargs是python中的可变参数。

*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个dict。

同时使用*args和**kwargs时,*args参数必须在**kwargs前,像foo(a = 1, b = '2', c = 3, 'a', 1, None)这样调用的话,会提示语法错误“SyntaxError: non-keyword arg after keyword arg”

2. 定义创建字典的函数

还有一个很漂亮的用法,就是定义创建字典的函数:

def creat_dict(**kwargs):
    return kwargs
    print(creat_dict(a = 1, b = 2, c = 3) == {'a':1, 'b':2, 'c':3})

creat_dict(e = 3)

输出结果如下:

{'e': 3}

其实python带有类dict,可以使用dict(e = 3)创建一个字典。

原文地址:https://www.cnblogs.com/Ivyli4258/p/8179731.html