- 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