我们之前讲了lambda创建匿名函数,可以使我们的代码更加的简洁,那么我们接着来讲解一下什么是偏函数?偏函数有什么样的作用?
接下来我们先来看一个栗子:
print('aaaaaaaaaa')
print('bbbbbbbbbb')
print('cccccccccc')
# 输出结果:
# aaaaaaaaaa
# bbbbbbbbbb
# cccccccccc
上面是我们经常会使用到的一个函数,print()可以打印我们想要输出的数据,我们会发现每一行它自动换行了;
这个之前我们也讲解过,在print()这个函数里有一个参数叫 end='\n',它的默认值就是换行,所以在我们每次输出完数据之后,他都会额外在输出一个 '\n' ,那我们要是不想让他自动换行该怎么办呢?
print('aaaaaaaaaa',end='')
print('bbbbbbbbbb',end='')
print('cccccccccc',end='')
# 输出结果:
# aaaaaaaaaabbbbbbbbbbcccccccccc
我们只需要手动修改默认参数就好了,但是这样岂不是很麻烦,如果我们要调用一百次不换行输出,那岂不是要写一百遍?
那么我们可以重新定义一个函数,在这个函数里面将默认值进行修改:
def print2(s,end=''):
print(s,end=end)
print2('aaaaaaaaaa')
print2('bbbbbbbbbb')
print2('cccccccccc')
# 输出结果:
# aaaaaaaaaabbbbbbbbbbcccccccccc
这样好像就方便多了,其实我们还有一个更加简便的方法,就是偏函数,我们先来看一下具体怎么使用:
from functools import partial
print2 = partial(print,end='')
print2('aaaaaaaaaa')
print2('bbbbbbbbbb')
print2('cccccccccc')
# 输出结果:
# aaaaaaaaaabbbbbbbbbbcccccccccc
我们可以调用partial()定义偏函数,在偏函数中我们可以修改默认参数,或者将参数设置默认值;
partial(函数名,参数名=参数值[,参数名=参数值])
那么,我们再看一个例子,我们对int()都不陌生,我们先来简单看下他的函数定义:
我们发现这里面还有一个 base=10 这么个参数,它的作用就是说进行强制类型转换的数据是几进制的,我们来举个栗子:
print(int('111',base=16))
print(int('111',base=8))
print(int('111',base=2))
# 输出结果:
# 273
# 73
# 7
默认情况下就是十进制到十进制,如果我们需要从二进制到十进制就需要修改 base这个参数了,同样的道理,我们想要大面积使用就可以用partial()进行创建一个偏函数:
int2 = partial(int,base=2)
print(int2('111'))
# 输出结果:
# 7
当我们发现, 在函数的调用中,有某个参数经常为一个固定值时,我们也可以定义一个偏函数进行调用:
def sum_num(a,b,c,d):
return a+b+c+d
sum_num2 = partial(sum_num,c=12)
print(sum_num(1,2,12,4))
print(sum_num2(1,2,d=4))
# 输出结果:
# 19
# 19