python 高阶函数

2018-09-01  本文已影响4人  __RY__

高阶函数定义


自定义sort函数

def sort(iterable, reverse=False, key=lambda x,y: x<y):
        ret = []
        for x in iterable:
                for i,y in enumerate(ret):
                        flag =  key(x,y) if not reverse else not key(x,y)
                        if flag:
                                ret.insert(i,x)
                                break
                else:
                        ret.append(x)
        return ret
print(sort([4,7,2,9,1,6]))

内建函数-高阶函数


柯里化Currying

# 将加法函数柯里化
def add(x,y):
    return x + y

# 转换如下
def add(x):
    def _add(y):
        return x + y
    return _add
add(5)(6)


函数注解 Function Annotaions

    add.__annotations__
    {'x': <class 'int'>, 'y': <class 'str'>, 'return': <class 'str'>}
    import inspect
    
    def add(x:int, y:int, *args, **kwargs) -> int:
            return x + y
    
    sig = inspect.signature(add)
    
    print(sig, type(sig)) 
    >>> 函数签名 (x:int, y:int, *args, **kwargs) -> int <class 'inspect.Signature'>
    
    print('params:',sig.parameters) 
    >>> params: OrderedDict([('x', <Parameter "x:int">), ('y', <Parameter "y:int">), ('args', <Parameter "*args">), ('kwargs', <Parameter "**kwargs">)])
    
    print('return:',sig.return_annotation ) 
    >>> return: <class 'int'>
    
    print(sig.parameters['x'],type(sig.parameters['x']))  
    >>> x:int <class 'inspect.Parameter'>
    
    print(sig.parameters['y'].annotation)  
    >>> <class 'int'>
    
    print(sig.parameters['args'],type(sig.parameters['args']))  
    >>> *args <class 'inspect.Parameter'> 
    
    print(sig.parameters['args'].annotation) 
    >>> <class 'inspect._empty'>
    
    print(add.__annotations__)  
    >>> {'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'str'>}
    
    print(sig.parameters['kwargs'])  
    >>> **kwargs
    
    print(sig.parameters['kwargs'].annotation)  
    >>> <class 'inspect._empty'>
    

    ### 检查用户输入是否符合参数注解的要求
    from functools import wraps
    import inspect
    
    def check(fn):
        @wraps(fn)
        def wrapper(*args,**kwargs):
            sig = inspect.signature(fn)
            params = sig.parameters # 有序字典
            # print(params)
            values = list(params.values())
            # flag = True
            for i,p in enumerate(args):
                param = values[i]
                if param.annotation is not param.empty and not isinstance(p,param.annotation):
                    print(p,'!==',values[i].annotation)
                    # flag = False
                    # break
            # if not flag:
            #   raise TypeError('都是你的错')
            for k,v in kwargs.items():
                if params[k].annotation is not inspect._empty and isinstance(v,params[k].annotation):
                    print(k,v,'!==',params[k].annotation)
            return fn(*args,**kwargs)
        return wrapper
    
    @check
    def add(x:int,y:int=6)->int:
        return x + y
    
    add(20,30)
    
上一篇 下一篇

猜你喜欢

热点阅读