Python Functools部分函数

Functools是Python中使用的标准框架,当处理作用于或返回其他函数的高阶函数时,它有助于扩展或使用这些函数,而无需重写它们。使用Functools可以使代码具有可读性,并且易于维护,效率高。

这个库包含两个主要的函数:partialpartialmethodpartialmethod 是一个已经定义的函数的特定参数的不可调用的方法描述符,并返回一个新的partialmethod 描述符。

让我们来看看partial() 这个函数。

在 Python 中使用 Functoolspartial() 函数

partial() 函数是一个高阶函数,它接受一个函数作为输入,并返回一个可以像其他函数一样在程序中使用的函数。当有一个有很多参数的函数,但我们每次使用该函数时只需要改变一个或两个参数时,Functools库中的partial() 函数就可以在这种情况下发挥作用。

partial() 函数的帮助下,我们可以从一个函数中冻结特定数量的参数,并创建一个新的简化函数,以返回一个带有位置参数和关键字的新partial() 对象。因此,它可以防止我们重写原始函数。

总的来说,partial() 是一个方便的工具,特别是在将各种输入应用于一个对象或将函数的一个参数包装成常数时。所以,使用partial() 函数的最终结果将打印出一个优雅的、可读的和可重用的代码。

在使用partial() 函数之前,我们必须从 Functools 库中导入它。让我们看看我们是如何实现这个函数的。

from functools import partial

由于我们已经用上面的代码导入了partial 库,我们可以像下面这样使用partial 命令。然后我们可以按照自己的意愿调用partial() ,它就会输出与定义的函数类似的函数以及一个固定值。

下面是标准化的partial() 函数和它的属性。

partial(func, /, *args, **keywords)

partial 函数由三个主要属性组成:函数、参数和关键字。

  1. partial.func (函数名) – 一个可调用的对象或一个函数,返回父函数的名称和十六进制地址。
  2. partial.args (位置参数) – 这个属性返回预先分配给partial() 函数的参数。
  3. partial.keyword (关键字参数) – 该属性返回预先分配给partial() 函数的关键字。

让我们使用partial() 函数及其属性来定义一个例子。

完整的代码:

from functools import partial
#original function
def multiply(a,b):
    return a*b
#partial function to multiply a as 2
multiplication1 = partial(multiply,2)
print(multiplication1(4))
#partial function to multiply b as 7
multiplication2 = partial(multiply, b=7)
print(multiplication2(3))
#simple multiply function with two variables
print(multiply(5,2))
#partial function with two values and multiply function
multiplication3 = partial(multiply,2,5)
print(multiplication3())
#defining some attributes in multiplication1, multiplication2 multiplication3
print('Function used in multiplication1 :', multiplication1.func)
print('Keywords for multiplication2 :', multiplication2.keywords)
print('Arguments for multiplication3 :', multiplication3.args)

输出:

Python Functools Partial - Output 1

首先,我们从functools 中导入了partial() 函数,并定义了一个名为multiply() 的函数,其中两个变量为ab 。这个multiply 函数将两个数字(a,b) 相乘。

from functools import partial
def multiply(a,b):
    return a*b

在下面的代码块中,partial() 函数被调用,并输出一个函数对象multiply() 和一个固定值2 。这里,partial() 函数调用multiply() ,并将a 作为2

在打印时,它将4 赋值给b ,并将结果打印为8

multiplication1 = partial(multiply,2)
print(multiplication1(4))

在这里,当partial() 函数被调用时,它打印出multiply() 函数和分配给b 的值为3. 它通过跳过原始函数的参数为变量b 指定值。

在打印时,它为a 定义了一个值为3 ,并将输出显示为21

multiplication2 = partial(multiply, b=7)
print(multiplication2(3))

当用两个变量的值调用函数时,partial() 函数并不是必不可少的。像往常一样,它把5 作为a2 作为b ,并把结果打印为10

print(multiply(5,2))

由于原函数在调用partial() 函数时有两个参数,所以不会有问题,它把multiply()a 作为2b 作为5 。然后,它将结果显示为10

multiplication3 = partial(multiply,2,5)
print(multiplication3())

下面的代码块分别显示了函数multiplication1 中使用的函数,multiplication2 中的关键字,以及multiplication3 中的参数。因此,multiplication1 中使用的函数是multiply() ,其十六进制值是000001E523A6E4C0

multiplication2 中,我们使用了{'b': 7} 作为关键字,而2, 5multiplication3 中使用的参数。

print('Function used in multiplication1 :', multiplication1.func)
print('Keywords for multiplication2 :', multiplication2.keywords)
print('Arguments for multiplication3 :', multiplication3.args)

总结

这篇文章讨论了functools 库中的partial() 函数。正如你在前面的例子中看到的,使用partial() 函数使我们的代码更易读,更优雅,更快速。

如果你发现一个函数冻结了一个或多个参数,partial() 函数将是最适合这种情况的。