函数定义形式:
def funName(arg...):
CodeBlock
return xx;
#如果函数暂时不做任何操作,需要这样写:
def funName(arg....):
pass; #此处不能够留空
默认参数:
- 从右向左使用默认参数
- 默认参数指向对象不会变化
- 定义默认参数要牢记一点:默认参数必须指向不变对象!
def printList(L =[]):
L.append("END");
#对于上述函数,L指向一个不变List对象
printList() ; # END
printList(); # END END
请注意下述情况:
def fun(name,arg = None):
if arg == None;
arg = [];
arg.append('END');
print(arg);
#对于任意一次调用只有一个'END'被添加到arg中
#None是不可变对象,每次构造[]都将使arg指向不同的List对象
可变参数:
- 函数参数名前面加*就构成可变参数了
- 可变参数变量实际上是是一个tuple
- 传递List tuple set变量时,使用*varName即可一次传递进去
def func(*nums):
pass;
func(1,2,3);
func(1,2);
list = [1,2,3];
func(*list);
关键字参数:
- 函数参数名前缀**
- 关键字参数函数内部传递为dict
- dict变量可以前缀**一次传递进去
def func(**info):
psss;
func(job = 'Engginer', arg = 15);
d = {'name':'lx','arg'=18};
func(**d);
命名关键字参数:
def per1(name,arg,*,job,city):
pass;
#只能接收以job city命名的关键字参数
#只能接收以job city命名的关键字参数
def per2(name,arg,*num,job,city):
pass;
小结:
- 参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
- 对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的
- 不要将五种参数多个组合,以免降低接口可读性