*args,**kwargs
def test1(arg,*args,**kwargs): print('arg :',arg,' type为:',type(arg)) print('*args :',args,' type为:',type(args)) print('**kwargs :',kwargs,' type为:',type(kwargs)) test1(1,2,3,4,None,False,True,a=2,c=3) ''' 输出: arg : 1 type为: <class 'int'> *args : (2, 3, 4, None, False, True) type为: <class 'tuple'> **kwargs : {'a': 2, 'c': 3} type为: <class 'dict'> '''
*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个dict。并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前,像foo(a=1, b='2', c=3, a', 1, None, )这样调用的话,会提示语法错误。
def test_args_kwargs(arg1, arg2, arg3): print("arg1:", arg1) print("arg2:", arg2) print("arg3:", arg3) args = ("two", 3, 5) # test_args_kwargs(args) 会报错,因为args这个元祖直接作为位置参数arg1传递进去了 arg2 arg3没传递 test_args_kwargs(*args) # 将args解包为三个位置参数 two 3 5 ''' 输出: arg1: two arg2: 3 arg3: 5 ''' args=(1,2,3,4) # test_args_kwargs(*args) 会报错,解包出来四个位置参数,方法中只有三个 kwargs = {"arg3": 3, "arg2": "two", "arg1": 5} # test_args_kwargs(kwargs) 会报错,还是把kwargs这个字典作为位置参数arg1传递进去了 arg2 arg3没传递 test_args_kwargs(**kwargs) # 将kwargs 解包成关键词参数 arg1=5 arg2='two' arg3=3 ''' 输出: arg1: 5 arg2: two arg3: 3 ''' kwargs = {"arg4": 3, "arg5": "two", "arg1": 5} # test_args_kwargs(**kwargs) 会报错,解包后arg4 arg5 这两个关键字参数 在方法中没有定义