Python基础及语法(六)

柯里化

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))
原文地址:https://www.cnblogs.com/bgr1115/p/12784598.html