Python中的偏函数

286 阅读2分钟

简单来说,偏函数functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,使得调用这个新函数会更简单。

例如,我们要把字符串转换为整数,我们可以调用int()函数:

>>> int('110101', base=2)
53

如果我们需要在一个项目中需要大量这样的转换,那么每次这样写代码就太麻烦了,那么我们可以自己定义一个新函数来调用:

>>> def new_int(x, base=2):
        return int(x, base)

在上面的代码中,我们将原本的int()的参数固定成了base=2,并定义成一个新的函数new_int(),现在我们再来看看调用新函数的结果:

>>> new_int('1000000')
64
>>> new_int('1010101')
85

在Python中,functools.partial就是帮助我们执行这样的操作的,不需要我们自己定义new_int(),可以直接像下面的示例代码一样创建一个新的函数new_int()

>>> import functools
>>> new_int = functools.partial(int, base=2)
>>> new_int('101010')
42
>>> new_int('10001000')
136

所以偏函数functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,使得调用这个新函数会更简单 在上面的示例代码中,我们将new_int()base设定成默认为2,但我们仍然可以在调用new_int()时传入其他值:

>>> new_int('123456', base=8)
42798

最后,创建偏函数时,实际上可以接收函数对象、*args和**kw这3个参数,当传入:

>>> new_int = functools.partial(int, base=2)

实际上固定了int()函数的关键字参数base,也就是说我们调用:new_int('10001000') 时,相当于:

>>> kw = { 'base': 2 }
>>> int('10001000', **kw)

当我们再定义一个偏函数:

>>> new_max = functools.partial(max, 3)

调用new_max(6, 24, 18, -10)时,相当于:

>>> args = (3, 6, 24, 18, -10)
>>> max(*args)
24

ps:

int()函数的默认base10,也就是将字符串以十进制为基础转换为十进制的整数,使用默认base值时,可以只传入字符串,省base值,如:int('123');同理,int('10001000', base=2)的含义就是将10001000以二进制为基础转换为十进制,此函数也可写成int('10001000', 2)