python学习随笔(八)_高阶函数_装饰器

* 待整理

 

高阶函数
y = g(f(x))

#容器可以比较内容
#返回是函数的时候内容比不了,比的是地址

for 循环正常执行后才执行else
break和return,for循环不能正常执行

'A'.lower()
str.lower ('A')=>str.lower(self)

sorted()    #函数

filter(function,iterable)
    #function,一个函数条件过滤
    #过滤可迭代对象的元素,返回一个迭代器

list(filter(lambda x):False,[1,2,3,4]))    #列表解析式


map(function,*iterables)-->map object    #映射
    #从一种形态到另一种形态,元素个数不会发生任何变化,一个都不能少
    #返回的也是迭代器

{i for i in map(lambda x :x,range(5)}
set(map(lambda x :x,range(5))
dict(map(lambda x:(x%5,x),range(500)))    #dict会覆盖key只有五项

zip()    #也是一个惰性求值的

---------------------------------------------------------------------------------------------------------------------------


柯里化

f(x,y)  =>  f(x)(y)

通过嵌套嵌套函数把函数转换成柯里化函数
---------------------------------------------------------------------------------------------------------------------------


python装饰器

硬编码:写死的要在函数里更改才能改功能

函数名.__name__
函数名.__doc__        #文档字符串要求写到文档函数的第一行

装饰器语法功能
它能将它下面的函数标识符提上来作为它的参数
@函数名    
def 函数名

例:
@copy_properties    #copy_properties(wrapper)
def wrapper

同时会为这个标识符赋值这个函数的返回值
wrapper = copy_properties(wrapper)


无参装饰器    #带缺省值的可以当无参装饰器
    它是一个函数
    函数作为它的形参
    返回值也是一个函数
    使用:@函数名方式调用
    
装饰器是高阶函数,装饰器对传入函数的功能增强


带参装饰器
    它是一个函数
    函数作为它的形参
    返回值是一个不带参的装饰器函数
    使用@functionname(参数列表)方式调用
    可以看做在装饰器外层又加了一层函数


带参装饰器#最多三层

偏函数
---------------------------------------------------------------------------------------------------------------------------

#无参装饰器
def logger(fn):
    def wrapper(*args,**kwargs):
        print('{}.x={},y={}'.format(fn.__name__,*args))
        ret = fn(*args,**kwargs)
        return ret
    return wrapper        
@logger##等价于add = logger(add)   =>add 就是wrapper
def add(x,y):
    return x+y
#def sub(x,y):
#     return x -y

ret = add(4,5)#wrapper(4,5)   logger(add)
# ret = sub(5,4)
print(ret)
---------------------------------------------------------------------------------------------------------------------------

#带参装饰器
from datetime import datetime
def copy_properties(src):
    def _copy(dest):
        dest.__name__ = src.__name__
        dest.__doc__ = src.__name__
        return dest
    return _copy

def logger(fn):
    @copy_properties(fn)         # 不加参数时等价于 @copy_properties   =>   wrapper = copy_properties(wrapper)

    #加参数后等价于wrapper = copy_properties(fn)(wrapper)
    #wrapper =  _copy(wrapper)#调用fn等价于返回_copy(跟下面的标识符)
    #wrapper = wrapper   #最后wrapper覆盖wrapper
    def wrapper(*args,**kwargs):
        '''this is wrapper function'''
        print('前面增强')
        start = datetime.now()
        ret = fn(*args,**kwargs)
        delta = (datetime.now()-start).total_seconds()
        print('Function{} took{}s'.format(fn.__name__,delta))
        print('name={}.x={},y={}'.format(fn.__name__,*args))
        if delta >5:
            print('so slow')
        else:
            print('so fast')
        print('后面增强')
        return ret
    #copy_properties(fn)(wrapper)
    return wrapper        
@logger
def add(x,y):
    '''this is add function'''
    return x+y

ret = add(4,5)
print(ret)

posted @ 2018-09-02 14:53  亦泉  阅读(117)  评论(0编辑  收藏  举报