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函数的参数问题还有很多,本文仅仅介绍几种常用的情况,仅做个简单的了解和参考。

 

 

posted @ 2013-05-28 11:48 YUKI小糖 阅读(...) 评论(...) 编辑 收藏