【飘逸的Python】 传递可变长度参数

来源:互联网 发布:druid log4j 打印sql 编辑:程序博客网 时间:2024/04/29 10:47

原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/50419402

熟悉C/C++的童鞋对下面这个函数肯定不陌生:

int main( int argc, char *argv[] ) /* 带参数形式 */{    ...    return 0;}

用户启动程序中,可以传递多个参数,其中argc是参数的个数,而argv字符指针数组中就保存了指向各个参数的指针。这样,就向程序中传递可变个数的参数。

那么,Python中有没有这样的功能呢?答案是肯定的。Python传递可变长度参数有两种形式,一种是非关键字可变长度参数,一种是关键字变量参数,下面具体讲述这两种方式。

非关键字可变长度参数

通常使用星号(*)声明一个非关键字可变长度参数,该参数必须在普通参数和默认参数之后。这样的函数声明通常如下:

def function_name([formal_args], *multi_args)

当函数被调用的时候,运行环境先将所有的形参赋值给函数声明中对应的局部变量,然后将剩下的非关键字参数放入一个元祖中供函数内部访问。所以实质上非关键字可变长度参数就是传递一个元组,将所有额外的参数添加到变量元组中而不会产生TypeError异常。

下面,我们看一个如何使用非关键字可变长度参数的例子

def multi_non_keyword_args(*args):    '非关键字可变长参数实例'    print type(args);    for item in args:        print item# 调用multi_non_keyword_args("arg1", "arg2", "arg3")

输出如下:

<type 'tuple'>arg1arg2arg3

关键字可变长度参数

通常使用两个星号(**)声明关键字可变长参数,该参数也必须放在普通参数、默认参数和非关键字可变长度参数之后。这样的函数声明通常如下:

def function_name([formal_args], *multi_args1, **multi_args2)

当函数被调用的时候,运行环境先将所有的形参赋值给函数声明中对应的局部变量,如果存在,再将剩下的非关键字参数放入一个元祖。最后把剩下的关键字参数放入一个字典中传入函数内部。

下面,展示一个关键字可变长参数的例子:

def multi_keyword_args(*args1, **args2):    '关键字可变长参数实例'    print type(args2)    print args2multi_keyword_args("arg1", "arg2", key1="key1", key2="key2")

输出:

<type 'dict'>{'key2': 'key2', 'key1': 'key1'}
0 0
原创粉丝点击