一 参数
定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。
对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了。函数内部的复杂逻辑被封装起来,调用者无需了解。
1.默认参数
def power(x,n=2):
s=1
while n > 0:
n = n - 1
s = s * x
return s
其中n
为默认参数,默认值为2。当调用power(5)
时,相当于调用power(5, 2)
:
>>> power(5)
25
>>> power(5,3)
125
1)设置默认参数时,有几点要注意:
①必选参数在前,默认参数在后,否则Python的解释器会报错。
②当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
2)可以设置多个默认参数:
def enroll(name,gender, age = 6,city = 'Beijing'):
print 'name:' , name
print 'gender:' , gender
print 'age:' , age
print 'city:' , city
有多个默认参数时,调用的时候,既可以按顺序提供默认参数,比如调用enroll('Sarah','F', 7)
,即除了name,gender
这两个参数外,最后1个参数应用在参数age
上,city
参数由于没有提供,仍然使用默认值。
>>> enroll('Sarah','F',7)
name: Sarah
gender: F
age: 7
city: Beijing
也可以不按顺序提供部分默认参数。当不按顺序提供部分默认参数时,需要把参数名写上。比如调用enroll('Adam', 'M', city='Tianjin')
,意思是,city
参数用传进去的值,其他默认参数继续使用默认值。
3)默认参数的陷阱
def add_end(l = []):
l.append('END')
return l
当使用默认参数调用时:
>>> add_end()
['END']
>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']
原因是:Python函数在定义的时候,默认参数l
的值就被计算出来了,即[]
,因为默认参数l
也是一个变量,它指向对象[]
。每次调用该函数,如果改变了l
的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]
了。
所以,默认参数必须指向不变对象。
解决办法:
def add_end(l = None):
if l is None:
l = []
l.append('END')
return l
2.可变参数
可变参数允许传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。
def cacl(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
在函数内部,参数numbers
接收到的是一个tuple。因此,函数代码完全不变。但是,调用该函数时,可以传入任意个参数,包括0个参数:
>>> calc(1, 2)
5
>>> calc()
0
还可以把list和tuple作为可变参数:
>>> num = [1,2,3]
>>> cacl(*num)
14
3.关键字参数
允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
def person(name, age, **kw):
print 'name:', name, 'age:', age, 'other:', kw
函数person
除了必选参数name
和age
外,还接受关键字参数kw
。在调用该函数时,可以只传入必选参数:
>>> person('Michael', 30)
name: Michael age: 30 other: {}
也可以传入任意个数的关键字参数:
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
和可变参数类似,也可以先组装出一个dict,然后,把该dict转换为关键字参数传进去:
>>> kw = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **kw)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
4.关键字组合
当同时调用以上四种参数时,参数定义的顺序必须是:必选参数、默认参数、可变参数和关键字参数。
比如定义一个函数,包含上述4种参数:
def func(a,b,c=0,*arg,**kw):
print 'a=',a, 'b=', b, 'c=', c, 'arg=', arg, 'kw=', kw
在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去:
>>> func(1,2)
a= 1 b= 2 c= 0 arg= () kw= {}
>>> func(1,2,3)
a= 1 b= 2 c= 3 arg= () kw= {}
>>> func(1,2,3,'a','b')
a= 1 b= 2 c= 3 arg= ('a', 'b') kw= {}
>>> func(1,2,3,'a',city = 'Beijing')
a= 1 b= 2 c= 3 arg= ('a',) kw= {'city': 'Beijing'}
通过一个tuple和dict,也可以调用该函数:
>>> args = (1, 2, 3, 4)
>>> kw = {'x': 99}
>>> func(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'x': 99}