*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 这两个关键字参数 在方法中没有定义

 

 

 

posted @ 2019-12-20 17:13  Alantammm  阅读(309)  评论(0编辑  收藏  举报