站长原创,版权所有ITEEDU,20011-4-22
>>> def testfun(fixed1,fixed2,key1=1,key2=2,*arg,**keywords): ... print "fixed1 parameters is ",fixed1 ... print "fixed2 parameters is ",fixed2 ... print "key1 parameter is ",key1 ... print "key2 parameter is ",key2 ... print "Arbitrary parameter is ", arg ... print "keywords parameter is ",keywords ... >>> testfun(1,2,3,4,5,6,k1=1,k2=2,k3=3) fixed1 parameters is 1 fixed2 parameters is 2 key1 parameter is 3 key2 parameter is 4 Arbitrary parameter is (5, 6) keywords parameter is {'k3': 3, 'k2': 2, 'k1': 1}
函数参数分为四部分:
fixed1fixed2固定参数
key1=1,key2=2关键字参数
*arg 多余普通参数列表
**keywords 多余关键字参数列表
函数声名部分,参数的四个部分不可颠倒位置,可以没有其中某几部分。
函数赋值部分,key=value型关键字参数要放后面,非关键字参数个数要不少于固定参数个数。
声明时的关键字参数与固定参数一样,只不过不对其赋值时有默认值。
>>> def f(a1,a2=1): print a1 print a2 >>> f(1,2) 1 2
赋值时key=value参数只是改变赋值顺序,没有别的意义。与声明时区分。
>>> def f(a1,a2): print a1 print a2 >>> f(a2=3,a1=4) 4 3 >>> def f(a1,a2=1): print a1 print a2 >>> f(a2=2,a1=1) 1 2
>>> testfun(1,2,3,4,5,6,key1=9,k1=1,k2=2,k3=3) Traceback (most recent call last): File "<pyshell#47>", line 1, in <module> testfun(1,2,3,4,5,6,key1=9,k1=1,k2=2,k3=3) TypeError: testfun() got multiple values for keyword argument 'key1'
原型
def testfun(fixed1,fixed2,key1=1,key2=2,*arg,**keywords):
函数赋值时,非关键字型的参数会顺序赋给函数的固定参数和关键字型参数,非关键字型参数一定要满足固定参数的个数,要不然会因为参数个数不足而出错。
上面的错误是因为非关键字参数个数太多,key1被赋值为3,后面的key1=1又对其进行赋值而产生。
要想用*args并对其赋值,赋值时函数参数都不能用k=v形式,最后给**kw赋值的除外。你可以想一想,要不然一定是错的。
其一
>>> def f(a,b,**kw): print a print b print kw >>> f(b=2,c=3,d=4,a=1) 1 2 {'c': 3, 'd': 4}
可以用k=v赋值时全用k=v的形式,后面**kw接收多余的参数。这样就不用考虑赋值时参数顺序了。而且参数名字一般的编辑器都有显示,也不是问题。
用**kw可以不改变函数原型,这在大多时候是很重要的。但必须知道要传的参数名,因为函数原型中没有,只能看__doc__了。所以这种方法写好文档,以供查阅。在参数很多,还可能增加时,这是最好的方法。
>>> def f(**kw): a='a' in kw and kw['a'] or 'no a' b='b' in kw and kw['b'] or 'no b' print a print b >>> f(a='aaa',b='bbb') aaa bbb >>> f(b='bbb') no a bbb >>>
Python 中函数参数可以分成一参两列表。一参又可以分为必赋值和有默认值的。
一参赋值