Python Functools简介

嗨哈布罗夫斯克 在Python开发人员课程开始之前,我们已经准备了另一本有用的材料的翻译




Python是一种高级的面向对象的编程语言。Python的最大优点之一是它具有特殊的功能,使您可以使用内置语言工具编写可重用的代码。

Functools是一个Python库,旨在与高阶函数一起使用。这样的函数可以采用其他函数并返回函数。它们帮助开发人员编写可重复使用的代码。可以使用或扩展功能,而无需完全重写它们。Python中functools模块提供了各种工具,可让您实现上述效果。例如,以下内容:

  • 部分的
  • 完整订购;
  • update_wrapper部分

局部 函数functools提供的主要工具之一让我们用例子弄清楚。

Python中的部分功能


functools模块中,部分功能被认为是最重要的工具之一。使用部分函数,可以替换已经传递参数的现有函数。此外,我们还可以通过添加质量文档来创建该功能的新版本。

我们可以通过传递部分参数来创建新函数。我们还可以冻结一些函数参数,这将导致出现新对象。表示partial的另一种方法是,借助它的帮助,我们可以创建具有默认值的函数。部分支持固定的关键字和位置参数。
让我们看一些例子。

如何创建函数


要创建部分函数,请使用partial()库中的functools内容如下:

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

因此,您将创建一个调用func局部函数,并向其传递固定关键字和位置参数。在这里,通常会传递一些必要的参数来调用func函数其余参数在* args** kwargs中传递 假设下面的函数将两个数字相加:



def multiply(x, y):
 
    return x * y

现在考虑当我们需要将给定数字加倍或增加三倍的情况。在这种情况下,我们定义新功能,如下所示:

def multiply(x, y):
        return x * y
 
def doubleNum(x):
       return multiply(x, 2)
 
def tripleNum(x):
       return multiply(x, 3)

当然,当函数的脚本只有2-3个时,如上所示,这样做更合乎逻辑。但是,当您需要再编写100个此类函数时,那么多次重写同一代码是没有意义的。这是局部函数派上用场的地方要使用它们,首先,我们需要Functools导入partial

from functools import partial
 
def multiply(x, y):
       return x * y
 
doubleNum = partial(multiply, 2)
   tripleNum = partial(multiply, 3)
 
Print(doubleNum(10))
 
Output: 20

从示例中可以看到,默认值将被左侧的变量替换。调用doubleNum(10)时,将代替x而是2,而不是y 在此示例中,顺序无关紧要,但是在其他用途​​中,它可能很重要。让我们看一下这种情况的示例,以了解变量替换的顺序。

from functools import partial
def orderFunc(a,b,c,d):
      return a*4 + b*3 + c*2 + d
 
result = partial(orderFunc,5,6,7)
print(result(8))
 
Output: 60

完整订购


我们有一个函数orderFunc(),其中我们乘以a4,乘以b3,c乘以2并将d值相加。

我们创建了一个部分函数result()orderFunc()函数使用值5、6和7进行调用。现在,值5、6和7将替换变量ab并且c相应地。该变量d将被8 替换,因为它是在调用时发送的result()。结果是(4 * 5 + 6 * 3 + 7 * 2 + 8)= 60。

在这种情况下,传输值的顺序将很重要,因为如果顺序更改,结果也将更改。要修复变量,可以使用关键字而不是位置参数。让我们使用关键字作为参数来重写上面的代码。

from functools import partial
def orderFunc(a,b,c,d):
       return a*4 + b*3 + c*2 + d
 
 result = partial(orderFunc,c=5,d=6)
print(result(8,4))
 
Output: 60

在这里,我们将变量的值固定为5并将变量的值固定为c6 d取而代之的是出现值8和4 而不是变量ab结果是(8 * 4 + 4 * 3 + 5 * 2 + 6)= 60. 可以在循环中确定

Partial函数并用于重复计算。让我们看一个例子:

from functools import partial
 
def add(x,y):
      return x + y
 
add_partials = []
for i in range (1, 10):
      function = partial(add, i)
      add_partials.append(function)
      print('Sum of {} and 2 is {}'.format(i,add_partials[i-1](2)))
 
  
Output:
 
Sum of 1 and 2 is 3
Sum of 2 and 2 is 4
Sum of 3 and 2 is 5
Sum of 4 and 2 is 6
Sum of 5 and 2 is 7
Sum of 6 and 2 is 8
Sum of 7 and 2 is 9
Sum of 8 and 2 is 10
Sum of 9 and 2 is 11

在此示例中,我们将使用2总结一定范围内的值,重用现有函数。我们可以在循环中调用partial,并使用其功能来计算总和。从输出中的值可以看出,我们有一个从1到10的循环,并且使用partial函数将此间隔中的所有值加到2 ,这称为加法函数。

元数据


尽管部分功能是独立的,但它们保留了扩展功能的内存(元数据)。

from functools import partial
 
def add(x,y):
      return x + y
 
# create a new function that multiplies by 2
result = partial(add,y=5)
print(result.func)
print(result.keywords)
 
Output:
<function add at 0x7f27b1aab620>
{'y': 5}

第一次调用func将传递函数名称及其在内存中的地址,第二次调用带有关键字的函数会将关键字传递给函数。因此,部分功能可以使用它们从可扩展功能接收的元数据称为自我记录。 我们可以使用functools中的另一个工具来更新函数元数据是可用于更新功能元数据的工具。让我们用一个例子弄清楚。

update_wrapper partial

Update_wrapper

def multiply(x, y):
 
    """Test string."""
 
    return x * y
 
 result = functools.partial(multiply, y=2)
 
 try:
 
    print ('Function Name:'+result.__name__)
 
except AttributeError:
 
    print('Function Name: __no name__')
 
 print ('Function Doc:'+result.__doc__)
 
 print('Updating wrapper:')
 
functools.update_wrapper(result, multiply)
 
 print ('Function Name:'+result.__name__)
 
print ('Function Doc:'+result.__doc__)
 
Output:
 
Function Name: __no name__
 
Function Doc:partial(func, *args, **keywords) - new function with partial application
 
    of the given arguments and keywords.
 
 
Updating wrapper:
 
Function Name: multiply
Function Doc: Test string.

现在,从输出中可以看到,在使用包装器之前,该函数没有分配名称或文档。一旦我们使用来更新namedoc函数update_wrapper,我们就会在输出中看到相应的结果。

结论


使用functools,我们可以摆脱冗余代码,并增加在Python中重用代码的可能性。使用函数的次数越多,打开的用例就越多。尝试并享受它!



上课程。



All Articles