参数
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)的形式调用它,无论它的参数是如何定义的。