嗨哈布罗夫斯克 在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()
,其中我们乘以a
4,乘以b
3,c
乘以2并将d
值相加。我们创建了一个部分函数result()
,orderFunc()
该函数使用值5、6和7进行调用。现在,值5、6和7将替换变量a
,b
并且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并将变量的值固定为c
6 d
。取而代之的是出现值8和4 而不是变量a
,b
结果是(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
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.
现在,从输出中可以看到,在使用包装器之前,该函数没有分配名称或文档。一旦我们使用来更新name和doc函数update_wrapper
,我们就会在输出中看到相应的结果。结论
使用functools,我们可以摆脱冗余代码,并增加在Python中重用代码的可能性。使用偏函数的次数越多,打开的用例就越多。尝试并享受它!
上课程。