怎样在python中使用可变长的参数
在函数定义中,*args和**kwargs这种特殊的形式用来向函数传递可变数的参数。一个星号的形式(*args)用来传递一个可变长度的tuple参数(非关键字可变长度的参数),两个星号的形式用来传递一个可变长度的字典参数。
下面是一个使用非关键字参数的形式。这个例子传递一个固定参数和两个变长参数。
def test_var_args(farg, *args):
print type(args)
print 'formal arg:', farg
for arg in args:
print 'another arg:', arg
test_var_args(1, 'two', 3)
|
结果:
<type 'tuple'> # 从这里可以看出,这个可变参数(*args)的类型是tuple
formal arg: 1
another arg: two
another arg: 3
|
下面是使用关键字参数的形式。同样,传递一个固定参数和两个关键字变量参数
def test_var_kwargs(frag, **kwargs):
print type(kwargs)
print 'formal arg:', frag
for key in kwargs:
print 'another keyword arg: %s : %s' % (key, kwargs[key])
test_var_kwargs(frag=1, myarg2='two', myarg3=3)
|
结果:
<type 'dict'> #从这里可以看出,这个可变参数(**kwargs)的类型是dict
formal arg: 1
another keyword arg: myarg2 : two
another keyword arg: myarg3 : 3
|
在调用函数时使用*args和**kwargs这种特殊的语法,不仅仅可以在函数定义中使用,也可以在调用函数的时候使用
def test_var_args_call(arg1, arg2, arg3):
print 'arg1:', arg1
print 'arg2:', arg2
print 'arg3:', arg3
args = (1, 'two', 3)
test_var_args_call(*args)
|
结果:
arg1: 1
arg2: two
arg3: 3
|
下面这个例子是在调用函数时使用关键字参数
def test_var_args_call(arg1, arg2, arg3):
print 'arg1:', arg1
print 'arg2:', arg2
print 'arg3:', arg3
kwargs = {'arg3':3, 'arg2':'two', 'arg1':1}
test_var_args_call(**kwargs)
|
结果:
arg1: 1
arg2: two
arg3: 3
|
下面是自己的总结:
args和kwargs这两个的名字是可以变化的
def test_var(**haha):
print type(haha)
for eachkey in haha:
print 'another keyword arg: %s: %s' % (eachkey, haha[eachkey])
>>> test_var(myarg1=1, myarg2='two', myarg3=3)
|
结果:
<type 'dict'> #都是dict
another keyword arg: myarg1: 1
another keyword arg: myarg2: two
another keyword arg: myarg3: 3
|
这就是说,
只要你用的是一个星号(*)的形式,就是一个非关键字的可变长的参数,两个星号(**)的形式就是一个关键字的可变长参数,而与名字args,kwargs无关。当然,最好还是用args,kwargs这两个名字,约定俗成的东西还是最好不要改。
当然,args和kwargs可以一起使用
def test_args_kwargs(*args, **kwargs):
for arg in args:
print arg
for key in kwargs: print key,kwargs[key]
test_args_kwargs(1, 'two', myarg3=3)
|
结果:
但是,这两者的使用是有顺序的,即单星号在前,双星号在后。
def test_args_kwargs(*args, **kwargs):
for arg in args:
print arg
for key in kwargs: print key,kwargs[key]
test_args_kwargs(myarg3=3, 1, 'two')
|
结果:
File "", line 1
SyntaxError: non-keyword arg after keyword arg
|
阅读(860) | 评论(0) | 转发(0) |