Python中最常见的函数参数定义是这样的function(param1, param2, ……),函数中可以定义任意个形式参数,形式参数之间用逗号分割。只需要在调用function时提供数量相等的一一对应的实际参数即可。比如下面代码
#! encoding=utf-8
def test_a(x, y):
"""最常见的函数形参定义,调用时实参和形参需要一一对应"""
print x, y
if __name__ == "__main__":
test_a(3, 5)
test_a(1)
test_a(3, 4, 5)
第一种调用正确,将实参2和4分别传递给形参x和y。第二种和第三种调用错误,提示 test_a() takes exactly 2 arguments。
这种方法有点不好就是当参数有很多的时候,参数的顺序很难记得住,这时候可以提供参数的名字。调用的时候参数名和值对应就行,和参数的顺序没关系了。比如下面代码
#! encoding=utf-8
def test_sub(minuend, subtrahend):
"""提供参数名字,调用时只需要参数名和值对应就行"""
print minuend - subtrahend
if __name__ == "__main__":
test_sub(minuend=3, subtrahend=5)
test_sub(subtrahend=5, minuend=3)
控制台打印结果:
-2
-2
还有一种常见的函数定义方法就是提供默认值,这和c++中的缺省参数一样。定义形式这样function(param1, param2=default_value,……),注意一下有缺省值的参数必须紧靠右括号或者参数中有带星号的参数就放到星号参数的前面(function(param1=value, param2)这种定义解释器并不能知道它们谁是谁了),这样定义的好处就是在调用函数时,有默认值的参数位置可以不传递实参,直接使用默认值,也可以传递实参,会覆盖形参的默认值。比如下面的代码
#! encoding=utf-8
def test_b(x, y, z=-1):
"""含有默认值的函数定义,调用时实参和形参需要不需要一一对应,调用时第三个参数可以不指定"""
print x, y, z
if __name__ == "__main__":
test_b(3, 5)
test_b(3, 4, 5)
控制台打印结果:
3 5 -1
3 4 5
我们经常能在Python程序中看到类似于这种带一个星号的参数,如function(param1, *param2)。这就是位置参数,表明用户在调用此函数时传递的参数可以是任意多个,第一个参数传递给param1,后面的所有参数组合成一个tuple,将这个tuple传递给param2。比如下面的代码
#! encoding=utf-8
def test_c(param1, *param2):
"""任意多个参数"""
print param1, param2
if __name__ == "__main__":
test_c(-1)
test_c(-1, 2, 5, 7, 8)
控制台打印结果:
-1 ()
-1 (2, 5, 7, 8)
还有就是两个星的函数参数定义了,如function(param1, **param2)。这就是关键字参数,用户在调用此函数时会将实参的第一个参数传递给param1,后面的所有参数作为键值对生成的字典对象传递给param2。比如下面的代码
#! encoding=utf-8
def test_c(param1, **param2):
"""关键字参数"""
print param1, param2
if __name__ == "__main__":
test_c(-1)
test_c(-1, x=2, y=5, z=7)
控制台:
-1 {}
-1 {'y': 5, 'x': 2, 'z': 7}
把这几个常用的参数放到一个函数定义中去,做一个测试。由于定义的函数有有位置参数变量,可以接受任意数量的参数,但是缺省参数在其前面,所以调用的时候第二个参数一定会作为缺省参数的值。缺省参数必须放到带星号参数的前面。比如如下代码
#! encoding=utf-8
def test_all(param1, param2=9, *param3, **param4):
"""默认参数,位置参数和关键字参数一起使用"""
print "param1:", param1
print "param2:", param2
print "param3:", param3
print "param4:", param4
if __name__ == "__main__":
print "缺省的参数,位置参数,关键字参数不传值"
test_all(1)
print "位置参数,关键字参数不传值"
test_all(1, 2)
print "关键字参数不传值"
test_all(1, 2, 3)
print "全部传值"
test_all(1, 2, 3, x=4, y=5, z=6)
控制台打印:
缺省的参数,位置参数,关键字参数不传值
param1: 1
param2: 9
param3: ()
param4: {}
位置参数,关键字参数不传值
param1: 1
param2: 2
param3: ()
param4: {}
关键字参数不传值
param1: 1
param2: 2
param3: (3,)
param4: {}
全部传值
param1: 1
param2: 2
param3: (3,)
param4: {'y': 5, 'x': 4, 'z': 6}