- 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 += xfor j in range(100):x += xreturn 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 partialdef my_func(a, b, c):return 2*a + 3*b + 4*cnew_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 reducenumbers = [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 = valuedef __eq__(self, other):return self.value == other.valuedef __lt__(self, other):return self.value < other.valueobj1 = testClass(1)
obj2 = testClass(2)print(obj1 == obj2)
print(obj1 != obj2)
print(obj1 < obj2)
print(obj1 >= obj2)
False
True
True
False