柯里化
z = f(x, y)转换成 z = f(x)(y)的形式
1 def add_front(x, y): # 柯里化前 2 return x+y 3 4 5 def add_after(x): # 柯里化后 6 def inner(y): 7 return x+y 8 return inner 9 10 11 print(add_front(4, 5)) # 9 12 print(add_after(4)(5)) # 9
装饰器
为一个封装好的函数添加功能
如为一个函数添加返回传参内容:
1 def logger(fn): 2 def inner(*args, **kwargs): 3 ret = fn(*args, **kwargs) 4 print(args, kwargs) # (4,) {'y': 5} 5 return ret 6 return inner 7 8 9 @logger # 装饰器 10 def add(x, y): 11 return x+y 12 13 14 print(add(4, y=5)) # 9
带参装饰器
1 import time 2 3 4 def logger(n): 5 def logger_(fn): 6 def inner(*args, **kwargs): 7 ret = fn(*args, **kwargs) 8 time.sleep(n) # 等待3秒 9 print(args, kwargs) # (4,) {'y': 5} 10 return ret 11 return inner 12 return logger_ 13 14 15 @logger(3) # 带参装饰器 16 def add(x, y): 17 return x+y 18 19 20 print(add(4, y=5)) # 9
属性更新
from functools import wraps
1 from functools import wraps 2 import time 3 4 5 def logger(n): 6 def logger_(fn): 7 @wraps(fn) # 如果不使用则最后输出inner inner's 8 def inner(*args, **kwargs): 9 """inner's""" 10 ret = fn(*args, **kwargs) 11 time.sleep(n) # 等待3秒 12 print(args, kwargs) # (4,) {'y': 5} 13 return ret 14 return inner 15 return logger_ 16 17 18 @logger(3) # 带参装饰器 19 def add(x, y): 20 """add's""" 21 return x+y 22 23 24 print(add(4, y=5)) # 9 25 print(add.__name__, add.__doc__) # add add'
注解
因Python是动态语言,所以注解只是友好的提示,不能避免类型使用错误。
def add(x: int, y: int) -> int: # 函数注解 """ :param x: int :param y: int :return: int """ return x+y a: int = 4 # 类型注解 b: int = 5 print(add(a, b)) # 9
inspect模块
1 import inspect 2 3 4 def add(x: int, y: int, *args: int, **kwargs: int) -> int: # 函数注解 5 """ 6 7 :param x: int 8 :param y: int 9 :return: int 10 """ 11 return x+y+sum(args)++sum(kwargs.values()) 12 13 14 a: int = 4 # 类型注解 15 b: int = 5 16 print(add(a, b, 1, 2, 3, c=6, d=7, e=8, f=9)) # 45 17 print(inspect.isfunction(add)) # True,isfunction判断是否为函数,返回True或False,此外还有其它is函数用法相似 18 sig = inspect.signature(add) # (x:int, y:int) -> int,signature获取签名 19 print(sig.return_annotation) # 获得返回值注解 20 print(sig.parameters) # OrderedDict([('x', <Parameter "x:int">), ('y', <Parameter "y:int">), 21 # ('args', <Parameter "*args:int">), ('kwargs', <Parameter "**kwargs:int">)]), 获得所有型参,返回有序字典 22 for k, v in sig.parameters.items(): # 该字典提供4个属性,以此是名字,缺省值,类型注解,传参类型 23 print(k, v, v.name, v.default, v.annotation, v.kind) 24 # x x:int x <class 'inspect._empty'> <class 'int'> POSITIONAL_OR_KEYWORD 25 # y y:int y <class 'inspect._empty'> <class 'int'> POSITIONAL_OR_KEYWORD 26 # args *args:int args <class 'inspect._empty'> <class 'int'> VAR_POSITIONAL 27 # kwargs **kwargs:int kwargs <class 'inspect._empty'> <class 'int'> VAR_KEYWORD
functools模块
reduce函数
1 import functools 2 print(functools.reduce(lambda x, y: x+y, range(10), 100)) # 145, reduce接受3个参数,依次是双参函数,迭代器,起始值
partial偏函数
1 import functools 2 import inspect 3 4 5 def add(x, y=0): 6 return x+y 7 8 9 new_add = functools.partial(add, x=1, y=2) # 保留原函数,重新定义函数型参的缺省值,生成新的函数 10 print(new_add(y=5)) # 6 11 print(inspect.signature(new_add)) # (*, x=1, y=2)
lru_cache装饰器
1 import functools 2 3 4 @functools.lru_cache() # 用内存空间换时间,本质是一个字典,记录数据,对重复计算的时候有一定优化 5 def fib(n, a=1, b=1): 6 return 1 if n < 3 else fib(n-1, b, a+b) + fib(n-2, b, a+b) 7 8 9 print(fib(101))