当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python Functools用法及代码示例


Functools 模块用于处理其他函数的高阶函数。它提供了与其他函数和可调用对象一起使用的函数,以使用或扩展它们而无需完全重写它们。该模块有两个类——partial 和partialmethod。

部分类

偏函数是特定参数值的原始函数。可以使用 functools 库中的 “partial” 在 Python 中创建它们。 __name__ 和 __doc__ 属性由程序员创建,因为它们不是自动创建的。 partial() 创建的对象具有三个只读属性: 语法:

partial(func, /, *args, **keywords)
  • partial.func- 它返回父函数的名称以及十六进制地址。
  • partial.args- 它返回部分函数中提供的位置参数。
  • partial.keywords- 它返回部分函数中提供的关键字参数。

例子:

Python3


from functools import partial
def power(a, b):
    return a**b
# partial functions
pow2 = partial(power, b=2)
pow4 = partial(power, b=4)
power_of_5 = partial(power, 5)
print(power(2, 3))
print(pow2(4))
print(pow4(3))
print(power_of_5(2))
print('Function used in partial function pow2 :', pow2.func)
print('Default keywords for pow2 :', pow2.keywords)
print('Default arguments for power_of_5 :', power_of_5.args)
输出
8
16
81
25
Function used in partial function pow2 : <function power at 0x7f8fcae38320>
Default keywords for pow2 : {'b': 2}
Default arguments for power_of_5 : (5,)

部分方法类

它是针对特定参数(例如部分函数)的已定义函数的方法定义。但是,它不可调用,而只是一个方法说明符。它返回一个新的部分方法说明符。

用法:

partialmethod(func, *args, **keywords)

例子:

Python3


from functools import partialmethod
class Demo:
    def __init__(self):
        self.color = 'black'
    def _color(self, type):
        self.color = type
    set_red = partialmethod(_color, type='red')
    set_blue = partialmethod(_color, type='blue')
    set_green = partialmethod(_color, type='green')
obj = Demo()
print(obj.color)
obj.set_blue()
print(obj.color)

输出:

black
blue

职能

Cmp_to_key 将比较函数转换为关键函数。对于不同的条件,比较函数必须返回 1、-1 和 0。可用于sorted()、min()、max()等关键函数。

用法:

function(iterable, key=cmp_to_key(cmp_function)) 

例子:

Python3


from functools import cmp_to_key
# function to sort according to last character
def cmp_fun(a, b):
    if a[-1] > b[-1]:
        return 1
    elif a[-1] < b[-1]:
        return -1
    else:
        return 0
list1 = ['geeks', 'for', 'geeks']
l = sorted(list1, key = cmp_to_key(cmp_fun))
print('sorted list :', l)

输出:

sorted list : ['for', 'geeks', 'geeks']

减少它对序列的元素重复应用两个参数的函数,以便将序列减少到单个值。例如,reduce(lambda x, y: x^y, [1, 2, 3, 4]) 计算 (((1^2)^3)^4)。如果初始值存在,则将其放在计算的第一位,默认结果是序列为空时。

句法:

reduce(function, sequence[, initial]) -> value  

例子:

Python3


from functools import reduce
list1 = [2, 4, 7, 9, 1, 3]
sum_of_list1 = reduce(lambda a, b:a + b, list1)
list2 = ["abc", "xyz", "def"]
max_of_list2 = reduce(lambda a, b:a if a>b else b, list2)
print('Sum of list1 :', sum_of_list1)
print('Maximum of list2 :', max_of_list2)

输出:

Sum of list1 : 26
Maximum of list2 : xyz

Total_ordering 它是一个类装饰器,填补了缺失的比较方法(__lt__、__gt__、__eq__、__le__、__ge__)。如果给定的类定义了一种或多种比较方法,“@total_ordering” 将根据给定的定义自动提供其余的方法。但是,该类必须定义 __lt__()、__le__()、__gt__() 或 __ge__() 之一,此外,该类还应提供 __eq__() 方法。

例子:

Python3


from functools import total_ordering
@total_ordering
class N:
    def __init__(self, value):
        self.value = value
    def __eq__(self, other):
        return self.value == other.value
    # Reverse the function of 
    # '<' operator and accordingly
    # other rich comparison operators
    # due to total_ordering decorator
    def __lt__(self, other):
        return self.value > other.value
print('6 > 2 :', N(6)>N(2))
print('3 < 1 :', N(3)<N(1))
print('2 <= 7 :', N(2)<= N(7))
print('9 >= 10 :', N(9)>= N(10))
print('5 == 5 :', N(5)== N(5))

输出:

6 > 2 : False
3 < 1 : True
2 = 10 : True
5 == 5 : True

Update_wrapper 它更新包装函数,使其看起来像包装函数。例如,对于部分函数,我们可以使用 update_wrapper(partial,parent) 更新部分函数,使其看起来像其父函数。这会将部分函数的文档(__doc__)和名称(__name__)更新为与父函数相同。

用法:

update_wrapper(wrapper, wrapped[, assigned][, updated])

例子:

Python3


from functools import update_wrapper, partial
def power(a, b):
    ''' a to the power b'''
    return a**b
# partial function
pow2 = partial(power, b = 2)
pow2.__doc__='''a to the power 2'''
pow2.__name__ = 'pow2'
print('Before wrapper update -')
print('Documentation of pow2 :', pow2.__doc__)
print('Name of pow2 :', pow2.__name__)
print()
update_wrapper(pow2, power)
print('After wrapper update -')
print('Documentation of pow2 :', pow2.__doc__)
print('Name of pow2 :', pow2.__name__)

输出:

Before wrapper update -
Documentation of pow2 : a to the power 2
Name of pow2 : pow2

After wrapper update -
Documentation of pow2 :  a to the power b
Name of pow2 : power

Wraps 它是一个函数装饰器,它将update_wrapper()应用于被装饰的函数。它相当于部分(update_wrapper,包=包,分配=分配,更新=更新)。

例子:

Python3


from functools import wraps
def decorator(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        """Decorator's docstring"""
        return f(*args, **kwargs)
    print('Documentation of decorated :', decorated.__doc__)
    return decorated
@decorator
def f(x):
    """f's Docstring"""
    return x
print('f name :', f.__name__)
print('Documentation of f :', f.__doc__)

输出:

Documentation of decorated : f's Docstring
f name : f
Documentation of f : f's Docstring

LRU_cache LRU_cache 是一个函数装饰器,用于保存最多 maxsize 的函数最近调用。如果使用相同的参数重复调用,这可以节省时间和内存。如果 *maxsize* 设置为 None,则缓存可以无限增长。如果 *typed* 为 True,则不同数据类型的参数将单独缓存。例如,f(1.0) 和 f(1) 将被不同地 memory 。

用法:

lru_cache(maxsize=128, typed=False)

例子:

Python3


from functools import lru_cache
@lru_cache(maxsize = None)
def factorial(n):
    if n<= 1:
        return 1
    return n * factorial(n-1)
print([factorial(n) for n in range(7)])
print(factorial.cache_info())

输出:

[1, 1, 2, 6, 24, 120, 720]
CacheInfo(hits=5, misses=7, maxsize=None, currsize=7)

SingleDispatch 它是一个函数装饰器。它将函数转换为通用函数,以便它可以根据第一个参数的类型具有不同的行为。它用于函数重载,重载的实现使用register()属性注册。

例子:

Python3


from functools import singledispatch
@singledispatch
def fun(s):
    print(s)
@fun.register(int)
def _(s):
    print(s * 2)
fun('GeeksforGeeks')
fun(10)

输出:

GeeksforGeeks
20


相关用法


注:本文由纯净天空筛选整理自naina024大神的英文原创作品 Functools module in Python。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。