学习目标
1、熟悉位置参数的使用。
2、熟悉默认参数的使用。
3、熟悉可变参数的使用。
4、熟悉关键字参数的使用。
5、熟悉命名关键字参数的使用。
位置参数
传入的参数必须依次赋值。
计算x²的函数:
def power(x):
return x*x
#power(5)时返回25
优化上述代码,计算x的任意n次方的函数:
def power(x, n):
s = 1
while n > 0 :
s = s * x
n = n - 1
return s
#power(5,3)时返回125
默认参数
优化代码后,旧的调用方式power(5)无法正常使用,因此可以使用默认参数进行优化,把n的默认值设为2即可实现:
def power(x, n=2):
#n非必传,不传则默认为2
s = 1
while n > 0 :
s = s * x
n = n - 1
return s
#power(5)时返回25
#power(5,3)时返回125
设置默认参数时,要遵循“必选参数在前,默认参数在后”的原则。
有多个默认参数时,调用的时候,可以按顺序提供默认参数,也可以不按顺序提供默认参数,但是必须写上参数名。
def enroll(name, gender, age=6, city='Beijing'):
print('name:', name)
print('gender:', gender)
print('age:', age)
print('city:', city)
#按顺序提供默认参数
enroll('Mike', 'M', 8, 'Tianjin')
# 不按顺序提供默认参数
enroll('John', 'M', city= 'Hefei', age=9)
默认参数的使用有个坑,默认参数指向可变对象list:
def add_end(L=[]):
L.append('END')
print(L)
return L
add_end([1, 2, 3])
add_end(['x', 'y', 'z'])
add_end() #返回['END']
add_end() #返回['END', 'END']
使用None这个不变对象修改上述例子:
def add_end(L=None):
if L is None :L = []
L.append('END')
print(L)
return L
add_end() #返回['END']
add_end() #返回['END']
因此,定义默认参数必须指向不变对象。
可变参数
可变参数就是传入的参数个数是可变的,可以是0个,1个,2个等,这些可变参数在函数调用时自动组装成一个tuple
以数学题为例,给定一组数字a,b,c...,计算a²+b²+c²+...。
首先,我们会想到先构造一个数组tuple或列表list再传参:
def calc(numbers):
sum = 0
for n in numbers:
sum = sum + n * n
print(sum)
return sum
calc([1,2,3])
calc((1,2,3))
将函数的参数改成可变函数:
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
print(sum)
return sum
calc(1, 2, 3)
calc()
nums = [1, 2, 3]
calc(nums[0], nums[1], nums[2]) #繁琐
calc(*nums) #简洁,常用
关键字参数
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装成一个dict。
def person(name, age, **kw):
print('name:', name, 'age:', age, 'others:', kw)
person('Mike', 30, city='Hefei')
person('Amy', 27)
person('Lucy', 25, gender='F', job='Enginere')
extra = {'city': 'Beijing', 'job': 'doctor'}
person('John', 43, city=extra['city'], job=extra['job'])
person('Tom', 28, **extra)
命名关键字参数
对于关键字参数,函数调用者可以传入任意不受限制的关键字参数。如果要限制关键字参数的名字,则可以使用命名关键字参数,使用特殊分隔符*后面跟着命名关键字参数。
def person(name, age, *, city, job):
#关键字必须只能传city和job
print(name, age, city, job)
person('Lily', 32, city='Guangzhou', job='Teacher')
person('Tim', 23)
如果函数定义中有可变参数,后面的命名关键字参数则不需要特殊分隔符*。
def person(name, age, *args, city, job):
print(name, age, args, city, job)person('Tom', 3, city='Guangzhou', job='Teacher')
person('Kiki', 12, 'Beijing', 'Nurse')
#命名关键字参数必须传入参数名
命名关键字参数也可以有缺省值:
def person(name, age, *, city='Beijing', job):
print(name, age, city, job)
person('Amy', 53, job='Boss')
参数组合
定义函数时,上述5种参数可组合使用,顺序必须是:必选参数(位置参数),默认参数,可变参数,命名关键字参数和关键字参数。
def f1(a, b, c=0, *args, **kw):
print('a=', a, 'b=', b, 'c=', c, 'args=', args, 'kw=', kw)
def f2(a, b, c=0, * ,d , **kw):
print('a=', a, 'b=', b, 'c=', c, 'd=', d, 'kw=', kw)
f1(1, 2, 3, 'hello', 'hi', d='D', e='E')
f2(1, 2, 3, d='D', e='E', f='F')
虽然可以组合多种参数,但是尽量不要同时使用太多的组合,避免接口可读性较差。