pyhton的定义函数中,可以使用4种参数:必选参数,默认参数,可变参数,关键字参数。同时,参数的定义顺序也必须按照此顺序。下面分别介绍这几种参数。
必选参数
>>>def power(base, exp):
... if exp == 0:
... return 1
... return base * power(base, exp-1)
这里我定义了一个求base的exp次幂的函数,其中的base和exp都是必选参数,也就是说函数接收两个数字作为参数。如果不是传入两个参数就会报错。
>>>power(4, 2)
16
>>>power(1)
Traceback (most recent call last): File
"<stdin>", line 1, in <module> TypeError: power() takes exactly 2 arguments (1 given)
默认参数
>>>def power(base, exp=2):
... if exp == 0:
... return 1
... return base * power(base, exp-1)
还是上面的函数例子,但是对于exp进行了赋值,exp被称为默认参数,它可以简化函数的调用,当期望的幂数不是2时才需要自己输入不同的数值。
但是注意一点:默认参数必须指向不变的对象,比如字符串和元组,像列表这样可变的对象则不行。
>>>def add_end(L=[]):
... L.append('END')
... return L
原因:默认参数本身就是一个变量,如果指向一个可变对象,当该对象的值发生变化,下次调用默认参数指向的不是原来的那个值。
>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']
可变参数
所谓可变参数指的就是参数的个数可变,而不是像必选参数那样必须按照给定的参数个数来传入参数。我们在定义函数中经常使用*args表示可变参数。
>>>def test(*args):
... sum = 0
... for num in args:
... sum += num
... return sum
这里定义了一个累加求和的函数,注意参数args的前面加了一个 “*”,这个符号表示args这个参数就是一个可变参数。此时你可以向test函数里面传入任意个数参数,这些参数在函数调用的时候自动组装成一个元组,不会像上面必选参数那样报错。
>>>test()
0
>>>test(1,2,3)
6
但是如果想使用列表或者元组中的元素作为参数直接将列表或者元组传入则会报错。
>>>test((1,2,3))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in test
TypeError: unsupported operand type(s) for +=: 'int' and 'tuple'
这个时候出现了一个神器 “*”,和表示参数是可变参数一样,在调用的时候加在list或者是tuple前面,把它们中的元素变为可变参数传入函数。
>>>test(*(1,2,3))
6
关键字参数
关键字参数在函数调用的时候会自动组装成一个字典,它起到拓展函数的功能。
>>>def userInfo(name, id, **kw):
... print 'name:',name,'id:',id,'otherInfo:',kw
...
>>>
>>>
>>>userInfo('James',1)
name: Jame id: 1 otherInfo: {}
>>>userInfo('Frank',2,age=21,job='student')
name: Frank id: 2 otherInfo: {'age': 21, 'job': 'student'}
和可变参数一样,在接收一个字典时候在前面加 “**”使得函数调用的时候将字典中的元素转化为可变参数传入到函数里面。不加的话则会报错。
>>>user = {'age': 21, 'job': 'student'}
>>>
>>>userInfo('Frank',2,**user)
name: Frank id: 2 otherInfo: {'age': 21, 'job': 'student'}
>>>
>>>userInfo('Frank',2,user)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: userInfo() takes exactly 2 arguments (3 given)