Chinaunix首页 | 论坛 | 博客
  • 博客访问: 45899
  • 博文数量: 13
  • 博客积分: 570
  • 博客等级: 中士
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-21 09:23
文章分类

全部博文(13)

文章存档

2010年(7)

2009年(4)

2008年(2)

我的朋友

分类: Python/Ruby

2010-03-08 23:17:01


怎样在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)

结果:

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


阅读(855) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~