Python函数参数总结
作为一个没有系统学习过python,却要与之日日相对看源码的人,真尼玛痛苦啊。。。经常看到**kws之类的,心中狂虐:这啥?指针的指针?!T^T
昨天看《Python核心编程》的时候,刚好看到了函数部分,于是顺势将目前接触到的集中参数类型都总结一下吧^^
总的来说,除去普通的normal args,python中比较特别的函数参数有:关键字参数、默认参数、非关键字可变长参数(元组)、关键字可变长参数(字典),下面将结合例子进行介绍。
关键字参数:调用时指定参数的名称,且与函数声明时的参数名称一致。使用关键字参数允许函数调用时参数的顺序与声明时不一致,仅根据参数的指定进行赋值。例:
# 函数定义 def foo(x, y): print 'x is %s' % x print 'y is %s' % y if __name__ == '__main__': # 标准调用 foo(1, 2) # 关键字调用 foo(y = 1, x = 2)
在标准调用中,x和y依次为1和2;在关键字调用中,x和y的值根据名字指定而与顺序无关。
# 标准调用输出 x is 1 y is 2 # 关键字调用输出 x is 2 y is 1
默认参数:在函数声明时,指定形参的默认值,调用时可不传入改参数(使用默认值)。例:
def tax(cost, rate = 0.17): print cost * (1 + rate) if __name__ == '__main__': # rate使用默认值0.17 tax(1000) # rate指定为0.05 tax(1000, 0.05)
使用默认值时,rate为0.17,结果为1170;在指定参数rate时,rate为0.05,结果为1050。
# tax(1000)的输出 1170.0 # tax(1000, 0.05)的输出 1050.0
非关键字可变长参数(元组):“非关键字”“可变长”顾名思义是允许在调用时传入多个“非关键字”参数,python会将这些多出来的参数放入一个元组中。例:
# 定义函数,其中*theRest为非关键字可变长参数 def tupleVarArgs(arg1, arg2='defaultB', *theRest): print 'formal arg 1: ', arg1 print 'formal arg 2: ', arg2 for eachXtrArg in theRest: print 'another arg: ', eachXtrArg
我们采用多种调用方式来查看结果,从而理解非关键字可变长参数的使用:
>>> tupleVarArgs('abc') formal arg 1: abc formal arg 2: defaultB
>>> tupleVarArgs('abc', 'def') formal arg 1: abc formal arg 2: def
>>> tupleVarArgs('abc', 'def', 'xyz', 123.4) formal arg 1: abc formal arg 2: def another arg: xyz another arg: 123.4
关键字可变长参数(字典):“关键字”“可变长”顾名思义是允许在调用时传入多个“关键字”参数,python会将这些多出来的<参数名, 参数值>放入一个字典中。需要注意的是,关键字变量参数应该为函数定义的最后一个参数,带**。例:
# 定义函数,其中**theRest为关键字可变长参数 def dictVarArgs(arg1, arg2='defaultB', **theRest): print 'formal arg 1: ', arg1 print 'formal arg 2: ', arg2 for eachXtrArg in theRest.keys(): print 'Xtra arg %s: %s' % (eachXtrArg, str(theRest[eachXtrArg]))
我们采用多种调用方式来查看结果,从而理解关键字可变长参数的使用:
>>> dictVarArgs('abc') formal arg 1: abc formal arg 2: defaultB >>> dictVarArgs('abc', 'def') formal arg 1: abc formal arg 2: def # a=1和b='aha'即为关键字可变参数,他们会被放入theRest字典 >>> dictVarArgs('abc', 'def', a=1, b='aha') formal arg 1: abc formal arg 2: def Xtra arg a: 1 Xtra arg b: aha # 全部采用关键字参数,但只有a和b是可变的,会被放入theRest >>> dictVarArgs(arg2='def', a=1, b='aha', arg1='put at the last') formal arg 1: put at the last formal arg 2: def Xtra arg a: 1 Xtra arg b: aha # 这次使用了arg2的默认值 >>> dictVarArgs('one', a=1, b='aha', name=('yuki', 'lau')) formal arg 1: one formal arg 2: defaultB Xtra arg a: 1 Xtra arg b: aha Xtra arg name: ('yuki', 'lau')
注意
当非关键字可变长参数和关键字可变长参数出现在同一个函数中时,他们应当遵守如下的顺序约定:
def newfoo(normal_arg1, normal_arg2, *non-keywords, ** keywords): pass
当然,你也可以直接向函数中传入元组和字典对象,如:
>>> newfoo(2, 4, *(6, 8), **{'foo': 10, 'bar': 12})
也可以来个“混搭”,孤立的可变长参数将会被放入对应的tuple或dict中,如:
>>> newfoo(2, 4, 3, x=4, y=5, *aTuple, **aDict)
在这个例子中,参数3会被放入aTuple,参数x=4和y=5会被放入aDict
当然关于Python函数的参数问题还有很多,本文仅仅介绍几种常用的情况,仅做个简单的了解和参考。