在函数那一章我们知道,定义一个函数,如果一个参数大多数时候是一个固定值,但也不排除有特殊值,那么就可以设置默认值。举个例子,int() 函数可以将字符串转换成数字,并且按十进制的结果转换。例如:
# 字符串转换成数字
int('12345')
# 结果:12345
事实上,这个int() 函数有个额外的base参数,只不过该base参数设置为了默认值10,如果修改该参数,那么该函数就可以做N进值的转换。注意,是字符串为该base参数所设定的进制,然后转换成十进制的数字。
# N进值的转换
int('123', base=8)
int('111', base=2)
# 结果:83 7
现在如果有大量二进制的字符串像转换成十进制数字,这样每次调用都要传入 base 参数,非常麻烦。我们可以自定义一个函数,来实现这个方法:
# int2() 用于转换二进制字符串
def int2(x, base=2)
return int(x, base)
那是不是我们如果想要实现上述类似的功能,就自定义一个函数呢?贴心的Python已经帮你解决了上述问题了,那就是偏函数。偏函数的功能就是设定参数的默认值,并返回一个新的函数,降低函数调用的难度。来看看如何使用偏函数实现上述功能的。
# 使用偏函数设定参数的默认值
import functools
# 第一个参数为函数名,第二个参数为参数默认值设置
int2 = functools.partial(int, base=2)
int2('111')
# 结果:7
创建偏函数时,实际上可以接收函数对象、*args和**kw这3个参数。如果填写了*args,那么就将该args中的数据插入到函数调用时传进的参数前边。
# 填写 *args 参数的结果
import functools
# 每次调用 max2() 时,都在其参数前添加10这一参数
max2 = functools.partial(nax, 10)
# 实际上就是 max2(10, 1, 3, 5)
print(max2(1, 3, 5))
# 结果:10
如果填写了**kw,就是设定函数中的默认参数,上述的 base=2 就是这个这个这个例子。