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}