什么是偏函数?
实际上,偏函数主要辅助原函数,作用其实和原函数差不多,不同的是,我们要多次调用原函数的时候,有些参数,我们需要多次手动的去提供值。而偏函数便可简化这些操作,减少函数调用,主要是将一个或多个参数预先赋值,以便函数能用更少的参数进行调用。
为清楚了解,我们看下面的代码
def my_sum(*args):
result = 0
for i in args:
result += i
return result
my_sum(1,2,3,4)
从上面的代码可知,此代码的功能就是实现一个求和功能,实例中是求取1,2,3,4四个数的和,但是当我们需要在这个结果上再加上7,8,9 甚至更多的数字或者求万又有更多的需求,应该怎么办呢,如下
my_sum(1,2,3,4)+my_sum(7,8,9)
注意到,每次有新需求时,都需要再次调用my_sum函数,这样很费力,参数多了之后更麻烦,而偏函数便可解决这类问题,因此偏函数可总结为:当函数的参数个数太多,需要简化时,使用 functools.partial 可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单
以下,我们再从代码层上看看偏函数
偏函数说明
- import:from functools import partial
- 第一个参数:自定义函数或者是python内置函数
- 第二个参数:可变参数,如果没有指定关键字,按原有函数的参数顺序进行补充,参数将作用在原函数上,如果指定关键字就对应到所指位置
基础款
def add(a, b):
return a + b
if __name__ == "__main__":
# 重新生成一个偏函数对象(其中一个参数已知),并赋予mysum,然后再调用这个新函数对象,10为预先设定的参数
mysum = partial(add, 10)
print mysum(5)
# 结果
15
关键字参数
def add(a, b=2):
return a + b
def add2(a=2, b=3):
return a + b
if __name__ == "__main__":
mysum = partial(add, 10)
print mysum()
# 也可根据关键字预先设定的参数值
mysum2 = partial(add, b=3)
print mysum2(1)
# 如果没有关键字,按原有参数顺序补充
mysum3 = partial(add2, 1)
print mysum3()
# 结果
12
4
4
升级款
class User(object):
def __init__(self, name, age):
self.name = name
self.age = age
def get_user_info(user, property_name):
value = eval('user.' + property_name)
return value
if __name__ == "__main__":
user = User('xiaoming', 20)
func = partial(get_user_info, property_name='age')
print func(user)
# 结果
20