1)先来看看默认值参数。
函数参数虽然提供了可以改变函数功能与行为的可能性,但是它也给调用函数的代码提出了基本要求,那就是,对于有参数的函数而言,必须在调用时指定参数。
比如上述的max函数,如果直接调用,系统会提示“TypeError: max() missing 2 required positional arguments: 'num1' and 'num2'”,含义就是说遗漏了两个必需的参数。
显然,这样有时也并不方便,比如我们通过参数来设置按国家,对于国内用户而言,默认都是中国,但是仍然需要输入中国这个参数数值。能否给函数参数定义一个默认值?调用函数时,只要没有赋值,那么就自动为默认值。方法就是在定义函数参数时通过等于号直接给参数赋一个默认的初始值:
def max(num1=0, num2=0):
if num1 > num2:
return num1
else:
return num2
print(max())
print(max(-1))
print(max(1, -1))
输出为:
0
0
1
在运行结果中,第一个输出为0,因为没有指定任何参数数值,两个参数默认都为0;第二个输出为0,其中-1将会自动赋给num1参数,输出的是默认为0的num2;第三个输出为1,这个是正常的参数赋值输出。
此时,并非所有参数都必须有默认值。
def max(num1, num2=0):
if num1 > num2:
return num1
else:
return num2
print(max(-1))
输出为:0,因为第一个参数为-1,第二个参数默认为0。
不过,这里经常会出现一个常见的错误:
def max(num1=0, num2):
if num1 > num2:
return num1
else:
return num2
在这段函数定义代码中,第一个参数默认为0,而第二个没有,这会导致函数定义错误,具体错误为“non-default argument follows default argument(没有默认值的参数不能跟在默认参数后面)”。其实原因也很简单,如果可以的话,那么在调用函数时如只有一个数值传递给参数,系统将会无法确定,这个数值究竟是应该用于改变第一个参数的默认值,还是直接赋给第二个没有默认值的参数。
在真实的数据分析任务中,我们常常会遇到带有很多参数的函数,其中很多参数还都有默认值。此时我们常常会有选择的更改一些参数,在一般情况下,正如前文所述,常见的做法就是利用关键字参数来表达。
2)再来看看列表参数。前文我们介绍了列表,它也可以作为函数的参数来传递。
此时的用法和其他类型的参数没有很大的区别,唯一的区别在于这个参数就像列表一样,可以按照循环遍历的方法逐个取出每个列表元素:
def arraySum(num):
sum = 0
for i in num:
sum += i
return sum
num = [1, 2, 3, 4, 5]
print(arraySum(num))
输出为:15。
但是,此时我们在调用函数时,要对该列表参数赋予一个列表变量。因此,上述调用函数代码也可以写为:
print(arraySum([1, 2, 3, 4, 5]))
输出内容同上,效果一样,但是此处直接将列表常量赋了过去。
有时,我们想更简单些使用,能不能写成这个样子:
print(arraySum(1, 2, 3, 4, 5))
此时的错误信息为“TypeError: arraySum() takes 1 positional argument but 5 were given”,意思是arraySum函数只有1个位置参数,但是你给了5个参数。显然,此时缺少了方括号,就会导致现在的参数变成了5个参数。其实,这反映了一个新的问题,有时候我们无法确定参数的个数,但是依然希望函数能够根据我们实际传递的参数个数来灵活处理。
对于此类参数,在Python可以使用专门的序列拆分操作符(*)来表示:
def arraySum(*num):
sum = 0
for i in num:
sum += i
return sum
print(arraySum(1, 2, 3, 4, 5))
输出为:15。方法很简单,就是在函数参数前面加上*号,此时表示序列拆分操作符,也就是说,函数会把全部的参数拿过来,自动变成一个列表,然后就可以按照处理列表参数的方式来处理这些不同个数的多个参数。
我们来看一个综合问题。我们想定义一个函数sumPower,可以计算多个数值的任意幂值之和,比如计算:
函数可以自由指定底数和幂的大小。我们初步给出了函数的实现代码:
def sumPower(*num, power):
sum = 0
for i in num:
sum += i ** power
return sum
print(sumPower(1, 2, 3, 4, 2))
在调用函数时,我们想表达1到4每个数的平方和:
但是运行遇到了麻烦。比如错误信息为“TypeError: sumPower() missing 1 required keyword-only argument: 'power'”,意思是说我们遗漏了一个必须的关键词参数。
其实,原因也很简单,此时虽然我们理解为1到4每个数的平方和,但是也可以理解为是5个底数,而此时则丢失了幂值的参数。
我们尝试使用默认值参数来解决:
def sumPower(*num, power=1):
sum = 0
for i in num:
sum += i ** power
return sum
print(sumPower(1, 2, 3, 4, 2))
输出为:12。此时虽然没有错误,但是看得出代码依然把全部参数都当成了底数,而幂值仍然为1。
因此,最有效的方法应该使用关键字参数来强制指定参数数值:
def sumPower(*num, power=1):
sum = 0
for i in num:
sum += i ** power
return sum
print(sumPower(1, 2, 3, 4, power=2))
输出为:30。此时即使不对power设置默认值,代码也没有问题,默认指数为1。由此就可以看出刚才错误的原因,这里需要增加关键字参数来明确不同参数的用途。
配套学习资源、慕课视频: