函数的参数种类
位置参数(必选参数)、默认参数、可变参数、命名关键字参数、关键字参数
位置参数
def power(x):
return x*x
默认参数
输入新的则按照新的记录,没有输入则按默认值记录
def power(x,n=2):
if n>2:
return x**n
else:
return x*x
print(power(3))
print(power(3,n=3))
#结果:
9
27
再比如:
def enroll(name, gender, age=6, city='Beijing'):
print(name)
print(gender)
print(age)
print(city)
enroll('Mike','F')
enroll('Jack','F',8,'Wuhan')
#结果:
Mike
F
6
Beijing
Jack
F
8
Wuhan
但是如果直接调用含有默认参数的函数的话,有的定义的函数对于默认参数就会赋予上一次的结果,默认参数会发生改变。
def add_end(L=[]):
L.append('END')
return L
print(add_end())
print(add_end())
print(add_end())
#结果:
['END']
['END', 'END']
['END', 'END', 'END']
可变参数
传入函数的参数个数是可变的,0个,1个或任意多个。由于参数个数不确定,我们想到可以把这些参数作为list或者tuple传进来。如:
def calc(numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
print(calc([1,2,3]))
#结果:
14
如果不想创建list或者tuple,直接输入参数的话,更改函数定义里的参数(加一个*):
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
如果已经有了一个list需要调用,则更改调用时的list(加一个*):
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
n = [1,2,3]
print(calc(*n))
这里将n和n互相的转化,有用且常见,可以理解为单个参数或者一个list或tuple直接的转化。*
关键字参数
关键字参数允许传入0个或任意个含参数名的参数,这些关键字参数自动组装为dict。
def person(name, age, **kw):
print(name,age,kw)
person('Michael', 30)
person('Bob', 35, city='Beijing')
#结果:
Michael 30 {}
Bob 35 {'city': 'Beijing'}
也可以先组装一个dict,然后把dict传进去:
extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, **extra)
Jack 24 {'city': 'Beijing', 'job': 'Engineer'}
命名关键字
限制关键字参数的名字,调用者仍可以传入不受限制的关键字参数,但只接收city
和job
作为关键字参数。这时区分位置参数和关键字参数用一个*
分隔符如:
def person(name, age, *, city, job):
print(name, age, city, job)
person('Jack', 24, city='Beijing', job='Engineer')
如果函数定义中存在一个可变参数(随便加入的那种),就不需要分隔符了。如:
def person(name, age, *args, city, job):
print(name, age, args, city, job)
print(person('Jack', 24, 'Chaoyang',city='Beijing', job='Engineer'))
#结果:
Jack 24 ('Chaoyang',) Beijing Engineer
命名关键字也可以有缺省值(默认值)如:
def person(name, age, *, city='Beijing', job):
print(name, age, city, job)
综合来看一下
参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
def f1(a, b, c=0, *args, **kw): #这里有可变参数(可填可不填),关键字参数
print(a,b,'c=',c, 'args =', args, 'kw =', kw)
def f2(a, b, c=0, *, d, **kw): #这里有命名关键字参数,关键字参数
print(a,b,'c=',c, 'd =', d, 'kw =', kw)
print(f1(1,2))
print(f1(1,2,3))
print(f1(1,2,3,'a','b'))
print(f1(1,2,3,'a','b',x=99))
print(f2(1,2,d=99,ext=None))
print(f2(1,2,'f=3',d=99,ext=None))
1 2 c= 0 args = () kw = {}
1 2 c= 3 args = () kw = {}
1 2 c= 3 args = ('a', 'b') kw = {}
1 2 c= 3 args = ('a', 'b') kw = {'x': 99}
1 2 c= 0 d = 99 kw = {'ext': None}
1 2 c= f=3 d = 99 kw = {'ext': None}
一样可以通过tuple或者dict传入。
>>> args = (1, 2, 3, 4)
>>> kw = {'d': 99, 'x': '#'}
>>> f1(*args, **kw)
1 2 c= 3 args = (4,) kw = {'d': 99, 'x': '#'}
>>> args = (1, 2, 3)
>>> kw = {'d': 88, 'x': '#'}
>>> f2(*args, **kw)
1 2 c = 3 d = 88 kw = {'x': '#'}