理解python中的参数(*和**的使用)


写在前面

在向函数传递参数时,有时候会看到*args**kwargs的字样,本文尝试理解个中含义。

使用args

将参数转换为元组形式保存到arg中

def foo(*args):
    print(args)

if __name__ == '__main__':
    foo(1,2)

output:
(1, 2)

使用kwargs

将参数转换为字典形式(必须指定参数进行传递)

def foo(**kwargs):
    print(kwargs)

if __name__ == '__main__':
    foo(a=1,b=2)

output:
{'a': 1, 'b': 2}

注意,这里在函数内部直接调用a或者b会报错,要用键值对的方式从kwargs中调用

二者同时使用

将未指定名称的参数转换为元组,将指定了名称的转换为字典

def foo(*args,**kwargs):
    print(args)
    print(kwargs)

if __name__ == '__main__':
    foo(1,2,b=3,d=4)

output:
(1, 2)
{'b': 3, 'd': 4}

与普通参数混合

先按顺序接收指定的参数,剩余的参数交给args和kwargs

def foo(a,*args,**kwargs):
    print(a)
    print(args)
    print(kwargs)

if __name__ == '__main__':
    foo(1,2,b=3)

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

以下使用是不合法的,*args之前的参数不应当使用参数名声明,之后的必须使用参数名声明

def foo(a,b,*args,**kwargs):
    print(a)
    print(b)
    print(args)
    print(kwargs)

if __name__ == '__main__':
    foo(1,3,b=1)

另外,可以使用字典向函数传递参数:

def foo(*args,a,b,z=None,**kwargs):
    print(a)
    print(b)
    print(z)
    print(args)
    print(kwargs)

if __name__ == '__main__':
    my_foo = {'a':1,'b':2,'z':3,'d':4}
    foo(**my_foo)

output:
1
2
3
()
{'d': 4}