Python functools module 的介绍与应用

  • Python functools module 的介绍与应用

functools module

lru_cache

from functools import lru_cache
import time

@lru_cache(maxsize=None)  # 设置缓存大小为无限制
def my_function(x):
    for i in range(1000):
        x += x
        for j in range(100):
            x += x
    return x

# 第一次调用函数,结果会被缓存
start1 = time.time()
result = my_function(5)
end1 = time.time()

print("first:", end1-start1)

# 后续的调用会直接使用缓存值
start2 = time.time()
result = my_function(5)
end2 = time.time()
print("first:", end2-start2)

 

 partial

  • 使用partial函数可以固定一个或多个函数的参数,生成一个新的函数 
from functools import partial

def my_func(a, b, c):
    return 2*a + 3*b + 4*c

new_func = partial(my_func, a=2, c=4)

result = new_func(b=3)
print(result)
29

 

位置参数 与 关键字参数

  • *args表示接受任意数量的位置参数。
    • 定义函数时,在参数列表中使用*args,可以让函数接受任意数量的位置参数,并将它们作为一个元组传递给函数体内部。
  • **kwargs表示接受任意数量的关键字参数。
    • 定义函数时,在参数列表中使用**kwargs,可以让函数接受任意数量的关键字参数,并将它们作为一个字典传递给函数体内部
def my_func(*args, **kwargs):
    # 处理位置参数
    for arg in args:
        print(arg)
    
    # 处理关键字参数
    for key, value in kwargs.items():
        print(f"{key} : {value}")

my_func(1, 2, 3, name='River', age=19)
1
2
3
name : River
age : 19

reduce 

  • functools.reduce(function, iterable, initializer=None)
  • function:一个二元函数,接受两个参数并返回一个值
  • iterable:一个可迭代对象,例如列表、元组、字符串等
  • initializer:一个可选的初始值,如果提供了该值,则会作为第一次调用function时的第一个参数。
from functools import reduce

numbers = [1, 2, 3, 4, 5]
words = ['Hello ', 'World ', '!', "River ", "Chandler "]
sum = reduce(lambda x, y: x + y, numbers)
print(sum)
factorial = reduce(lambda x, y: x * y, numbers[:3])
print(factorial) 

sentence = reduce(lambda x, y: x + y, words, "River ")
print(sentence) 
15
6
River Hello World !River Chandler 

total_ordering

  • total_ordering装饰器的作用是基于__eq__和__lt__来自动生成其他比较方法
  • 通过使用该装饰器,我们只需要定义部分比较方法,然后它会自动为我们生成其余的方法。

 

from functools import total_ordering

@total_ordering
class testClass:
    def __init__(self, value):
        self.value = value

    def __eq__(self, other):
        return self.value == other.value

    def __lt__(self, other):
        return self.value < other.value

obj1 = testClass(1)
obj2 = testClass(2)

print(obj1 == obj2)   
print(obj1 != obj2)   
print(obj1 < obj2)    
print(obj1 >= obj2)   

 

False
True
True
False

你可能感兴趣的:(数学建模,抽象代数,python,numpy)