python函数(3)
一. 位置参数:
格式:
def 函数名(参数1,参数2,参数3...):
函数体
pass关键字表示啥都不干。函数体不能为空,如果想创建一个空函数,可以使用该关键字。if内部代码块也可以使用该关键字。
调用空函数时,默认返回None。
数据类型检查可以用内置函数isinstance()实现。

函数还可以返回多个值,如下图,我们求ax²+bx+c=0(a≠0)方程的解。

函数实际上返回的是一个tuple类型结果。语法上,返回一个tuple可以省略括号,多个变量按照位置顺序依次赋值。
二. 默认参数
调用fun函数时,默认参数位置可以空着,空着代表该参数取默认值,而且默认参数一定在后面。e.g. fun(1)
def fun(m, n=0):
return m + n
多个默认值时,调用该函数可以按照顺序传值,不按照顺序的时候,需指定变量名设值传进去。

设置默认参数,需要注意一个坑。当默认参数是个空list列表时,不使用默认参数不会出问题。而使用默认参数时,因为在函数定义的时候,args就已经指向对象[],连续2次调用,都是往同一个对象[]里新增元素,所以会出问题。如下图:

所以我们定义默认参数的时候,必须指向不变对象(数值、字符串、None等)。
三. 可变参数
参数前面加上*即可。调用时,可以空参,也可以随便传几个值,当传递list或tuple时,变量前需加上*。
函数会把可变参数组装成tuple型数据。
def 函数名(*args):
函数体

四. 关键字参数
参数前面加上**。
该参数可以空参,也可以传1个或多个a='value'型参数,也可以先创建dict对象,传递dict对象时,对象前需加上**。
函数会把kwargs组装成dict对象。
函数中的kwargs参数会对传递过来的对象进行拷贝,所以函数体内对kwargs的操作并不影响原先创建的dict对象值。
def 函数名(**kwargs):
函数体

五. 命名关键字参数
参数前面加上*,
格式:
def 函数名(*, a, b, ...):
函数体
调用函数传值时,变量名必须对应起来。
缺省变量参数时,函数中该变量参数必须设定默认值。如下图:

当命名关键字参数前面有可变参数时,可省略 *,。如下图:sex、hobby就是命名关键字参数。

六. 混合参数组合
上面五种参数混合使用时,需按照顺序排列:位置参数、默认参数、可变参数、命名关键字参数、关键字参数。很明显,参数不确定性程序依次增加。示例如下:

惊奇的发现,调用fun5函数时,只传递1个tuple和1个dict也能调用。
所以,对于任何参数的函数,我们都可以通过func(*args, **kw)这个方式调用。