Python 的 functools 模块提供了很多有用的函数,其中之一就是偏函数(Partial function)。需要注意的是,这里的偏函数与数学意义上的偏函数并不相同。在介绍函数参数的时候,我们提到过通过给参数设置默认值,可以降低函数调用的难度。部分功能可以做同样的事情。举例如下:
int() 函数可以将字符串转换为整数。当只传入字符串时,int()函数默认按十进制转换:
>>> int('12345')
12345
但是int()函数还额外提供了一个base参数,默认值为10。如果传入base参数,就可以进行N进制转换:
>>> int('12345', base=8)
5349
>>> int('12345', 16)
74565
假设需要转换大量的二进制字符串,每次都传int(x,base=2)很麻烦,于是想到可以定义一个int2()的函数,把base=2传进去默认:
def int2(x, base=2):
return int(x, base)
这样,我们转换二进制就非常方便了:
>>> int2('1000000')
64
>>> int2('1010101')
85
functools.partial 就是帮我们创建一个偏函数。我们不需要自己定义 int2() 。我们可以直接使用下面的代码来创建一个新的函数int2:
>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85
所以简单总结一下functools.partial的作用就是固定一个函数的一些参数(也就是设置默认值),返回一个新函数,调用这个新函数会更容易一些。
注意上面的new int2函数只是将base参数重新设置为默认值2,但是你也可以在调用函数的时候传入其他值:
>>> int2('1000000', base=10)
1000000
最后,在创建偏函数时,传入时实际上可以接收三个参数:函数对象、*args和**kw:
int2 = functools.partial(int, base=2)
实际上固定了int()函数的关键字参数base,也就是:
int2('10010')
相当于:
kw = { base: 2 }
int('10010', **kw)
当传入:
max2 = functools.partial(max, 10)
作为 *args 的一部分,实际上会在左边自动添加 10,即:
max2(5, 6, 7)
相当于:
args = (10, 5, 6, 7)
max(*args)
结果为10。
小结
当函数参数过多需要精简时,使用functools.partial创建新函数。这个新函数可以固定原函数的一些参数,更方便调用。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 如何在mongodb数据库中创建表11/14
- ♥ 如何使用python软件08/14
- ♥ python中求最小公倍数的两种方法09/04
- ♥ python如何遍历列表08/29
- ♥ 如何在 Python 中创建一个固定长度的列表09/13
- ♥ python muggle_ocr 库介绍10/27
内容反馈