python可变参数调用函数问题


一直使用python实现一些想法,最近在使用python的过程中出现这样一个需求,定义了一个函数,第一个是普通参数,第二个是默认参数,后面还有可变参数,在最初学习python的时候,都知道非关键字可变参数和关键字可变参数两种,调用的方式也非常多种多样,这里主要提出一个比较隐含的问题,并将各种可能出现的情况进行了探讨。

函数声明格式

python虽然不支持函数重载,但是通过对函数参数的众多特性的支持基本弥补了。函数声明的通式如下:

def func(argv1,argv2...[,argv_d = default1,...]\
        [,*var_argv][,**var_key_argv])

这是python函数声明的通式,首先是普通参数若干个,也可以没有,接着是带默认值的参数,然后是非关键字可变参数,最后是关键字可变参数。这为python提供的强大函数调用奠定了基础。

函数调用

正是在函数调用的过程中遇到了问题。为了说明,我定义了一个如下的函数进行说明:

def f1(a,b=1,*var): print a,'\t',b,'\t',var
def f2(a,b=1,**var): print a,'\t',v,'\t',var

首先普通参数可以使用按位置的方式调用,同时可以使用按形参关键字调用。默认值参数也是使用位置方式匹配或者关键字调用。实例如下:
这里写图片描述
这里没有使用后面的可变参数,一切都没有问题。问题是,本人遇到的一个需求是,默认参数需要就是使用默认值调用,同时还有可变参数,而且是非关键字参数,那么调用时就会出现下面的情况:
这里写图片描述
可以看到,通过非关键字可变参数传入参数之后,python会默认把非关键字可变参数的前面若干个(这里是1个)当做<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPsSsyM+yzsr9o6zV4sDvysfS8s6qztLDu9PQzOG5qcSsyM+yzsr9YrXE1rWjrNX9ysfV4rj21K3S8qOs1NrO0rXEs8zQ8tbQ0rvWscO7t6LP1qGjuvPAtNfUz7DLvL+80rvPwqOst6LP1lB5dGhvbr3iys3G99f2s/bV4tH5tcS+9raou7nKx9PQ0ru2qLXEtcDA7bXEo6zS8s6qPHN0cm9uZz63x7nYvPzX1r/JseSyzsr9ysfErMjPss7K/dauuvO1xMj0uMm49rLOyv2jrLb41Nq199PDtcTKsbry08nT2sO709C0q8jrxKzIz7LOyv21xNa1o6xQeXRob27O3reoxdC2z7W9tde008TEwO+/qsq8yse/ybHkss7K/aOs0vK0y9Taw7vT0LSryOvErMjPss7K/bXE1rXKsaOsvs3SwLTOtNO3x7nYvPzX1rLOyv2jqLX308PV38jPzqq1xKOp1tCwtNXVy7PQ8rPpyKHIpbWx1/bErMjPss7K/bXE1rWjrNXitNOy4MPmwtvWpMHLt8e52Lz819a/ybHkss7K/dTacHl0aG9uxNqyv8rHus3G1c2oss7K/cSsyM+yzsr90ruyorSmwO21xDwvc3Ryb25nPqGjPGJyIC8+DQrL5Mi7yc/K9rX308PT0NCpvKu2y6OstavKx8i3yrW74bP2z9bV4tH5tcTQ6Mfzo6zEx8O0v8nS1Mq508O52Lz819a/ybHkss7K/b340NDM5ru7o6zJz8r2zsrM4r7Nv8nS1L3ivvbBy6OsPHN0cm9uZz7S8s6qveLKzcb3yse/ydLUx/ix8LnYvPzX1rLOyv26zcSsyM+yzsr9tcQ8L3N0cm9uZz6jrLX308PI58/Co7o8YnIgLz4NCjxpbWcgYWx0PQ=="这里写图片描述" src="http://www.2cto.com/uploadfile/Collfiles/20150608/20150608102759405.jpg" title="\" />
在使用关键字可变参数时,还有一个重要问题就是,关键字参数的键值不能有普通参数或者默认参数的参数名重复,这从侧面论证了,python对关键字调用和关键字可变参数在内部都是经过同一个字典保存的,因此不能有重复的键,调用如下:
这里写图片描述
上述遇到的问题是在实际操作过程中遇到的,一般从各种教程、书本学习python都只是说明上述的函数声明和调用的方式,但是几乎没有这种实际操作中可能遇到的点点滴滴,因此学习任何东西最好的方式就动手,这个真理永远不会变啦!

评论关闭