Python *args & **kwargs

*args

*args是可变的positional arguments列表

*args:将参数打包成元组(tuple)给函数调用

在函数中用 args 调用

def test1(*args):
    print(args)
    print(*args)
    test2(args)
    test2(*args)


def test2(*args):
    print(args)


if __name__ == '__main__':
    test1('a', 'b', 'c')

输出结果

('a', 'b', 'c')
a b c
(('a', 'b', 'c'),)
('a', 'b', 'c')

所以 *args 是 3 个字符串:'a', 'b', 'c'
args 是装着这 3 个字符串的元祖:('a', 'b', 'c')

位置参数对于其他参数的影响

示例:

# 可以获取到前面的位置参数,a 接收第一个位置参数,b 接收后面所有的位置参数
def foo(a, *b):
	pass
# a 可以获取到前面所有的位置参数,b 只能通过关键词参数传参
def foo(*a, b):
	pass
# 不接受位置参数,`*` 后面的参数只能通过关键词传参
def foo(*, b):
	pass

如果传位置参数会报错:
TypeError: foo() takes 0 positional arguments but 1 were given

**kwargs

**kwargs是可变的keyword arguments列表
**kwargs:将参数打包成字典(dict)给函数调用
在函数中用 kwargs 调用
示例:

def test1(**kwargs):
    print(kwargs)
    test2(kwargs=kwargs)
    test2(**kwargs)


def test2(**kwargs):
    print(kwargs)


if __name__ == '__main__':
    test1(a='a', b='b', c='c')

输出结果

{'a': 'a', 'b': 'b', 'c': 'c'}
{'kwargs': {'a': 'a', 'b': 'b', 'c': 'c'}}
{'a': 'a', 'b': 'b', 'c': 'c'}

所以 **kwargs = {a='a', b='b', c='c'}
注意 **kwargs 并不能直接 print 出来
kwargs = {'a': 'a', 'b': 'b', 'c': 'c'}

总结

当函数内部调用其他以 *args 或 **kwargs 为参数的函数时,传入的参数应当为 *args 或 **kwargs 而不是 args 或 kwargs
参数arg、*args、**kwargs三个参数的位置必须是一定的。必须是 (arg, *args, **kwargs) 这个顺序,否则程序会报错

posted on 2019-09-29 10:08  doubtful  阅读(336)  评论(0编辑  收藏  举报

导航