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
#! 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
#! 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)
#! 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}