Functools 模块–Python成为专业人士笔记

“专业人士笔记”系列目录:

创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!

partial

分部函数基于另一个函数来创建函数。它用于将值绑定到函数的参数(或关键字参数),并生成一个之前没有定义参数的可调用函数

一般而言,任何可调用对象都可以作为本模块用途的函数来处理

functools.partial返回的是一个可调用的partial对象,使用方法是partial(func,args,*kw),其中func是必须要传入的,而且至少需要一个args或是kw的参数

from functools import partial

def fa(a,b,c):  #定义一个相加的函数
    return a+b+c

p=partial(fa,4)  #定义分部函数,其中第3个参数已固定

print(p(1,2))  # 初始化前两个参数

看完上面的代码,你是否觉得分部函数到底一般什么应用场景?那我们再看下面的代码:

from functools import partial

def sq(a,b):  #初始化求冥运算函数
    return a**b

#求平方  分部函数
pingfang=partial(sq,2)

#求立方  分部函数
lifang=partial(sq,3)


#求2的平方
print(pingfang(2))

#求2的立方
print(lifang(2))

#输出:
4
9

再看上面的代码,用分部函数是否程序更加简洁以及灵活了许多呢?

cmp_to_key

Python改变了它的排序方法, 其可以接受一个关键函数,这些函数接受一个值并返回一个用于排序数组的键

该函数主要用来将老式的比较函数(comparison function)转化为关键字函数(key function) 以使程序转成 Python 3 风格

比较函数也是可调用的,其可以接受两个参数,比较这两个参数并根据他们的大小关系返回负值、零或正值中的某一个

import functools

import locale  #多语言模块

print(sorted(["A", "S", "F", "D"], key=functools.cmp_to_key(locale.strcoll)))
#按英文字母排序

#输出:
['A', 'D', 'F', 'S']

lru_cache

可以使用@lru_cache缓存装饰器包装一个耗时的、计算密集型的函数。这允许对函数调用进行记忆,这样具有相同参数的未来调用就可以立即返回,而不必重新计算

from functools import lru_cache

@lru_cache(maxsize=None)# maxsize=None 不限制缓存大小
def fibonacci(n):
    if n < 2:
        return n
    
    #进行递归,增加计算复杂度 
    return fibonacci(n - 1) + fibonacci(n - 2)

#调用该递归函数
print(fibonacci(99))

#输出:
218922995834555169026

当首次运行后,结果会缓存起来,再运行结果就会在缓存中获取了

total_ordering

当我们想要创建一个有序的类时,通常我们需要定义方法eq(), lt(), le(), gt()和ge() (注意:上述函数都为内置函数,实际代码会被”__”包围)

total_ordering修饰符应用于一个类,它允许定义eq(),并且在lt()、le()、gt()和ge()之间只允许定义一个eq(),即可允许类上的所有排序操作:

 @total_ordering
 class Employee:
     …
     def eq(self, other):
         return ((self.surname, self.name) == (other.surname, other.name))

     def lt(self, other):
         return ((self.surname, self.name) < (other.surname, other.name))

修饰符通过所提供的方法和代数操作共同派生其他比较方法。例如,如果我们定义了lt()和eq(),并且我们想要推导gt(),我们可以简单地检查not __lt__()和not __eq__()

reduce

reduce() 函数会对参数序列中的元素进行累积运算。在Python 3中,之前已经解释过的reduce函数已经从内置函数中删除,现在必须从functools中导入 :

from functools import reduce

def factorial(n):
    return reduce(lambda a, b: (a * b), range(1, n + 1))
    #结合lambda匿名函数,返回一个从n至n+1之间累计相乘的值

#这里传的n的值是2
print(factorial((2)))  #等同于:1*2 (注意不是1*2*3,range函数的数值范围是不包括第2个参数本身的)

上述代码均通过python3云环境调试,有任何问题请随时指正,请不要转载,谢谢

猜你喜欢

转载自blog.csdn.net/oSuiYing12/article/details/106490547