Python函数
Python的函数定义非常简单,但灵活度非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。
1.位置参数
def power(x):
return x*x
对于power(x)函数,参数x就是一个位置参数。
当我们调用power函数时,必须传入有且仅有的一个参数x:
power(2)
4
power(10)
100
def power(x,n):
s = 1
while n > 0:
n = n - 1
print('before:',s)
s = sx
print('after:',s)
return s
2.默认参数
def power(x,n=2):
s = 1
while n > 0:
n = n -1
s = sx
return s
注意:(1)必选参数在前,默认参数在后,否则Python解释器会报错
(2)如何设置默认参数,当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面,变化小的参数可以作为默认参数,这样可以降低函数调用的难度
注意:定义默认默认参数必须指向不变对象
大家反复调用使用默认参数看看结果如何
def add(L=[]):
L.append('End')
return L
原因:Python函数在定义的时候,默认参数L的值就是被计算出来的,即[],因为L是一个变量,它指向对象L,每次调用该函数,如果改变了L的内容,则在下次调用的时候,默认参数内容就变了
对上面的例子做好修改:
def add(L=None):
if L is None:
L=[]
L.append('End')
return L
3.可变参数
在Python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是多个,还可以是0个。
要定义Python函数,我们可以确定输入的参数,由于参数个数不确定,我们可以想到使用list或tuple传进来,例子:
def calc(numbers):
sum = 0
for n in numbers:
sum = sum + n
return sum
cacl([1,2,3])
6
cacl((1,2,3))
6
也可以简写如下:
cacl(1,2,3)
6
我们把以上例子修改为可变参数:
def cacl(*numbers):
sum = 0
for n in numbers:
sum = sum + n
return sum
定义可变参数和定义list或tuple参数相比,仅仅在参数前面加了个*号。
cacl(1,2,3)
6
cacl()
0
最常见的的写法:
nums=[1,2,3]
cacl(*nums)
6
总结:可变参数允许传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple
4.关键字参数
关键字参数允许传入0个或任意个包含参数名的参数,这些关键字参数在函数内部自动组装为一个dict,实例:
def person(name,age,**mn):
print('name:',name,' age:',age.' other:',mn)
函数person除了接收参数name和age之外,还接受关键字参数mn。在调用该函数时,可以只传入必选参数:
person('peter',29)
name:peter age:29 other:{}
也可以传入关键字参数:
person('peter',29,city='nanjing')
name:peter age:29 other:{'city':'nanjing'}
关键字函数有什么作用?可以扩展函数的功能
和可变函数类似,我们可以先组装一个dict,然后把dict转换为关键字参数传进去:
infos=['city':'nanjing','job':'engineer']
person('peter',29,**infos)
name:peter age:29 other:{'city':'nanjing','job':'engineer'}
infos表示把infos这个dict的所有的key-value用关键字参数传入到函数的person的mn参数,mn将获得一个dict字典数据类型,注意mn获得到的是一个mn的一份拷贝,对mn的改动不会影响到函数外的dict类型变量infos。
5.命名关键字参数
对于关键字参数,函数的调用者可传入任意不受限制的关键字参数;如果需要限制关键字参数的名字,也就是dict的key,就可以用命名关键字参数,例如city和job作为命名关键字参数,定义的函数如下:
def person(name,age,,city,job):
print(name,age,city,job)
和关键字参数不同,命名关键字参数需要一个符号分隔符,*后面的参数被视为命名关键字参数。
调用方式如下:
person('Peter',27,city='nanjing',job='engineer')
Peter 27 nanjing engineer
如果函数定义中有了一个可变参数,后面的命名关键字参数就不需要一个特殊分隔符了:
def person(name,age,args,city,job):
print(name,age,args,city,job)
注意:命名关键字参数必须传入参数名,这和第1条的位置参数参数不同
命名关键字参数可以有缺省值,从而简化调用:
def person(name,age,*,city='nanjing',job):
print(name,age,city,job)
所以我们可以这样调用:
person('peter',29,job='engineer')
peter 29 nanjing engineer
使用命名关键字参数时,特别注意,如果没有可变参数,就必须加一个作为特殊分隔符。如果缺少,Python解释器兼顾无法识别位置参数和命名关键字参数。