可变参数
参数个数可变,1个2个任意个,或0个。
默认参数调用:
def calc(numbers):
sum=0
for n in numbers:
sum=sum+n*n
return sum
需要先组装出一个list或tuple
calc([1,2,3])
输出:
14
可变参数调用:
def calc(*numbers):
sum=0
for n in numbers:
sum=sum+n*n
return sum
简化调用:
calc(1,2,3)
输出:14
如果已经有一个list 或tuple, 调用一个可变参数:
nums=[1,2,3]
calc(*nums)
*nums表示把nums这个list的所有元素作为可变参数传进去。
关键字参数
可变参数允许传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。
而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict(键-值)。
def person(name ,age ,**kw):
print('name:',name,'age:',age,'other:',kw)
函数person中除了必选参数name和age以外,还接受关键字参数kw。在调用该函数时,可以只传入必选参数
person('Danny',30)
输出:
name:Danny age:30 other:{}
也可以传入任意个数的关键字参数:
person('Ada',45,gender='M',job=Engineer')
输出:
name:Ada age:45 other:{'gender':'M','job':'Engineer'}
关键字参数的作用:扩展函数。
比如在person中,可以接收 name 和 age 两个参数,但若有更多参数,也能接收到。
和可变参数类似,可以先组装出一个dict,然后把这个dict转换为关键字参数传进去:
extra={'city':'Beijing','job':'Engineer'}
person('Jack',24,city=extra['city'],job=extra['job'])
输出:
name:Jack age:24 other:{'city]:'Beijing','job':'Engineer'}
简化写法:
extra={'city':'Beijing','job':'Engineer'}
person('Jack',24,**extra)
输出:
name:Jack age:24 other:{'city':'Beijing','job':'Engineer'}
**extra表示把 extra 这个 dict的所有key-value用关键字参数传入到函数的**kw参数,kw将获得一个dict,但对kw的改动不会影响到函数外的extra。
命名关键字参数
关键字参数,函数的调用者可以传入任意不受限制的关键字参数。传入的参数需要在内部通过kw检查。
如在person()函数中,检查是否有city和job参数:
def person(name,age,**kw):
if 'city' in kw:
pass
if 'job' in kw:
pass
print('name:',name,'age:',age,'other:',kw)
仍可以传入不受限制的关键字参数:
person('Jack',24,city='Beijing',addr='Chaoyang',zipcode=123456)
若要限制关键字参数的名字,就用命名关键字参数,如只接收 city 和 job 作为关键字参数:
def person(name,age,*,city,job):
print(name,age,city,job)
和关键字参数*kw不同的是,命名关键字参数需要一个特殊分隔符‘ * ’ , ‘ * ’后面的参数被视为命名关键字参数:
person('Jack',24,city='Beijing',job='Engineer')
输出:
Jack 24 Beijing Engineer
若函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不需要特殊分隔符 ' * '了:
def person(name, age, *args, city, job):
print(name, age, args, city, job)
命名关键字参数必须传入参数名。而位置参数可不用。
参数组合
参数定义顺序:必选参数、默认参数、可变参数、命名关键字参数、关键字参数