python中函数位置参数与关键字参数
Python中函数的参数依照不同的方式,可以有不同的分类,这里以“位置参数”与“关键字参数”两类进行讨论.
A. 区分位置参数和关键字参数:
在定义函数的时候,一般有两种方式来指定参数,比如python的内置工厂函数int(x, base=10) 就包含了两种不同的参数,第一个参数 x, 第二个参数 base, 这个参数还有个默认值10. 参数x就是位置参数,而参数base就是关键字参数;所以关键字参数通常是以“key=value”的方式出现在函数的定义当中的,而位置参数则只有参数的名字出现;据此就可以识别位置参数和关键字参数
B. 在定义函数时候两种参数的不同点:
关键字参数因为是以"key=value"的方式出现在函数定义时候的参数列表中,并且在函数体中对该参数引用的是key, 所以这个参数在函数的参数列表中的位置无关紧要.
但是位置参数则不同,如果函数定义时候,其参数列表里面全部是位置参数,那么在函数定义的时候,这些参数在参数列表中的位置也无关紧要. 但如果函数定义时候既有位置参数,也有关键字参数,那么 所有的位置参数都必须在关键字参数之前,否则会报: ”SyntaxError: non-default argument follows default argument“ 错误;
C. 在调用函数时候的不同:
调用函数的时候,通常需要传递函数的参数,这个时候,位置参数必须按照匹配的位置进行传递,否则会发生错误,而多个关键字参数之间则没有位置的要求,下面的参数传递是没有问题的:
#!/usr/bin/env python
def calc(str,n1='10',n2='100'): #函数定义时候的 位置参数必须在关键字参数之前;
pass
calc("+",n1=4,n2=199) #传递给位置参数str的值:"+" 不能写到其他的位置,而 关键字参数n1,n2可以互换位置;
D. 可变长的位置参数以及关键字参数:
在有的情况下,我们函数的参数列表长度是不固定的,典型的是我们使用装饰函数的时候,我们需要传递所有的参数,而这时候参数的个数是不确定的,我们可以用 *args 来表示所有的 匿名位置参数,**kwargs 来表示所有的匿名关键字参数(其中使用名称args, kwargs 是使用习惯使然,当然可以改用其他的名称), args参数的类型是tuple , 其值是所有的匿名位置参数组成的元组, kwargs的类型是 dict, 其值是匿名的每一个关键字参数 以key:value的形式组成的字典. 下面展示一个复杂的参数传递的例子:
#!/usr/bin/env python
def myfunction(n1,n2,s="default value.",m=9,*args,**kwargs):
print "n1="+str(n1),"n2="+str(n2),"s="+str(s),"m="+str(m),args,kwargs
myfunction(1,2,3,4,5,6,7,8,ps=1)
输出的结果为:
n1=1 n2=2 s=3 m=4 (5, 6, 7, 8) {'ps': 1}
简单分析下上述的代码:
- 函数定义时候的参数列表: 匿名参数总是 在参数列表的最后,并且仍然遵循位置参数在关键字参数的前面,所以 最后两个参数分别是: *args, **kwargs
- 在函数调用的时候,传递的参数同样需要遵循 位置参数在前,关键字参数在后的规范,而 向关键字 参数传递值的时候,可以用 key=value的方式,也可以直接用value的方式,所以在这个例子中,变量s 以及m的默认值都被修改了;比如 int("123",8) 与 int("123",base=8) 两种方式都表示传递 给关键字参数 base的值8.,至此,也就不难理解上述的结果了.