问题描述
Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。
解决方案
定义函数的时候,把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。
使用方法
位置参数:
可以先写一个计算平方的函数
def count(x): return x**2 |
对于count(x)函数,参数x就是一个位置参数,当调用count函数时,必须传入有且只有一个参数x:
Print(count(5)) |
但当需要计算x的多次方时就需要再加一个参数
def count(x,n): s=1 while n>o: n=n-1 s=s*x return s |
修改后的count(x, n)函数有两个参数:x和n,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数x和n。例如计算5的10次方。
Print(count(5,10)) |
默认参数:
由于经常计算x的平方,所以,完全还可以把第二个参数n设为默认值。
def count(x,n=2): s=1 while n>0: n=n-1 s=s*x return s print(count(5)) |
这样,当调用count(5)时,相当于调用count(5,2),而对于n>2的其他情况,就必须明确地传入n,比如count(5,3)。但必选参数在前,默认参数在后,且默认参数必须指向不定变量。
可变参数:
顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。要定义出这个函数,必须确定输入的参数。由于参数个数不确定,首先想到可以把a,b,c……作为一个list或tuple传进来,这样,函数可以定义如下:
def calc(n): sum=0 for i in n: sum=sum+n*n return sum |
但是调用时,需要先组装出一个list或tuple:
关键字参数:
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
def person(name, age, **kw): print(‘name:’,name,‘age:’,age,’other:’kw) |
函数person除了必选参数name和age外,还接受关键字参数kw。在调用该函数时,可以只传入必选参数,也可以传入任意个关键字参数:
>>> 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'} |
和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。
def person(name,age *,city,job): print(name.age,city,job) |
结语
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。虽然可以组合多达5种参数,但不要同时使用太多的组合,否则函数接口的可理解性很差。