参数
python的函数具有很灵活的参数形式,可以是:
位置参数(最常见的参数,可以使用tuple代替),
默认参数(给默认值),
可变参数(参数的个数可以改变,传入的其实是list或者tuple),
关键字参数(传入的其实是dict)。
位置参数
#参数
#位置参数 默认参数
#计算x的n次方
def power(x,n=2):
s=1
while n>0:
s=s*x
n=n-1
return s
print(power(3))
》9
print(power(4,4))
》256
默认参数
#默认参数 小心有坑
def add_end(L=[]):
L.append('end')
print( L)
add_end()
》['end']
add_end()
》['end', 'end']
这里第二次调用方法的时候输出不再是['end']而是['end', 'end']
定义默认参数要牢记一点:默认参数必须指向不变对象!
要修改上面的例子,我们可以用
None
这个不变对象来实现:
def add_end(L=None):
if L is None:
L=[]
L.append('end')
print( L)
add_end()
》['end']
add_end()
》['end']
这样无论调用多少次都输出['end']
可变参数
在参数前面加一个星号*,函数内部参数接受到的是一个tuple
#可变参数
#计算a2 + b2 + c2 + ……
def calc(*arg):
sum=0
for n in arg:
sum=sum+n*n
return sum
print(calc(1,2,3,4))
》30
也可以直接把一个list或者tuple的元素变成可变参数传进去,在变量前面加一个星号*
#把list或者tuple做可变参数
num=list(range(1,4))
print(calc(*num))
》14
关键字参数
参数可以是0个或任意带参数名的参数,这些参数在函数内部自动组成为一个dict
#关键字参数
def person(name,age,**kw):
print('name:',name,' age:',age,'other:',kw)
person('Peter',35)
》name: Peter age: 35 other: {}
person('Peter',35,city='SH',sex='F')
》name: Peter age: 35 other: {'city': 'SH', 'sex': 'F'}
#把dict做关键字参数
extra={'city':'SH','job':'Engineer'}
person('Peter',35,**extra)
》name: Peter age: 35 other: {'city': 'SH', 'job': 'Engineer'}
要注意定义可变参数和关键字参数的语法:
*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})
。
请注意:
参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。