def power(x, n): return x ** n
站在形参的角度:
x 和 n 都是位置参数
站在实参的角度:
x 和 n 有两种传参的方法
(1)严格按照顺序进行传参
(2)按照默认参数的形式进行传参python
>>> power(2, n = 4) 16 或 >>> power(n=4, x=2) 16
在平常使用中,咱们发现计算最多的都是 x 的平方,可是咱们每次调用都须要传递两个参数,在这样的状况下,咱们能够将 n 默认设置为 2,这就是默认参数。函数
>>> power(4) 16 或者 >>> power(4, n=2) 16
而对于 n > 2 的其余状况,就必须明确的传入 n 好比:power(4, n=4)spa
>>> power(4, n=4) 256
从上面的例子能够看出,默认参数能够简化函数的调用。设置默认参数时,有几点须要注意:
(1)必选参数(位置参数)在前,默认参数在后,不然Python的解释器会报错;
(2)把变化大的参数放前面,变化小的参数放后面。变化小的参数就能够做为默认参数。对象
使用默认参数能够下降调用函数的难度,可是定义默认参数要牢记一点:默认参数必须指向不变对象! blog
在python函数中,还能够定义可变参数。可变参数就是传入的参数个数是可变的,能够是1个、2个到任意个,还能够是0个。ci
定义可变参数:it
def calc(*args): n = 0 for i in args: n += i return n >>> calc(1,2,3,4,5,6) # 能够传入的参数个数是可变的 21 >>> calc(1,2,3) 6
也能够直接传入一个 list 或者 tuple,传入方式以下:class
>>> li = [1,2,3,4] >>> calc(*li) 10 >>> t1 = (1,2,3,4,5,6) >>> calc(*t1) 21
可变参数容许传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个 tuple。而关键字参数容许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个 dict 。语法
>>> def person(name, age, **kwargs): # 关键参数定义为: **kwargs ... print('name:', name, 'age:', age, 'other:', kwargs) ... >>> person('jay', 20, city='taibei', sex='male') # 关键字参数容许传入0个或任意个含参数名的参数 name: jay age: 20 other: {'sex': 'male', 'city': 'taibei'} # 函数调用时自动组装为一个 dict
对于关键字参数,函数的调用者能够传入任意不受限制的关键字参数。至于到底传入什么,就须要在函数内部经过kwargs检查,若是要限制关键字参数的名字,就可使用命名关键字参数,例如 person函数只接收 city 和 job 做为关键字参数。定义以下:程序
和关键字参数**kwargs不一样,命名关键字参数须要一个特殊分隔符*,*后面的参数被视为命名关键字参数。
>>> def person(name, age, *, city, job): ... print(name, age, city, job) ... >>> person('jay', 20, city='taibei', job='singer') jay 20 taibei singer
在python中定义函数,能够用位置参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数均可以组合使用。可是请注意,参数定义的顺序必须是: 位置参数、默认参数、可变参数、命名关键字参数、关键字参数
好比定义一个函数,包含若干参数:
>>> def f1(a, b, c=3, *args, **kwargs): ... print('a=', a, 'b=', b, 'c=', c, 'arg=', args, 'kwargs=', kwargs) ... >>> f1('a', 'b', 'c', 'd', 'e', 'f', h='H', i='I' ,j='J') a= a b= b c= c arg= ('d', 'e', 'f') kwargs= {'i': 'I', 'j': 'J', 'h': 'H'}
默认参数必定要用不可变对象,若是是可变对象,程序运行时会有逻辑错误!要注意定义可变参数和关键字参数的语法: *args是可变参数,args接收的是一个tuple; **kw是关键字参数,kw接收的是一个dict。 以及调用函数时如何传入可变参数和关键字参数的语法:可变参数既能够直接传入:func(1, 2, 3),又能够先组装list或tuple,再经过*args传入:func(*(1, 2, 3));关键字参数既能够直接传入:func(a=1, b=2),又能够先组装dict,再经过**kw传入:func(**{'a': 1, 'b': 2})。