使用和实现装饰器

使用装饰器格式为:@+装饰器名称;实现一个装饰器首先要理解闭包的思想,如下例子:实现了斐波那契数列

def fb(n):

    if n <= 1:
        return 1

    return fb(n-1) + fb(n-2)

以上实现方式每次都要计算元素,非常耗时和消耗内存,以下增加了一个缓存的字典,从缓存中读取大大提高了运算的速度


def fb(n ,cahe = None):
    
    if cahe is None:
        cahe = {}

    if n in cahe:
        return cahe[n]

    if n <= 1:
        return 1

    cahe[n] = fb(n-1) + fb(n-2)
    return cahe[n]

 

如果实现多种不同的算法,为了节省运算时间,每个算法都要添加一个缓存,会出现很多的重复代码,所以使用闭包的思想实现一个装饰器,如下

'''装饰器使用了闭包的思想'''
def memo(fun):

    ache = {}

    def wrap(*args):

        if args not in ache:
            ache[args] = fun(*args)
        return ache[args]
    return wrap

@memo #@memo是 fb = memo(fb) 在python中提供的简单写法
def fb(n):

    if n <= 1:
        return 1

    return fb(n-1) + fb(n-2)

@memo
def climb(n, steps):

    count = 0
    if n == 0:
        count = 1

    elif n > 0:
        for step in steps:
            count += climb(n - step, steps)
    return count


print fb(60)

print climb(10, (1, 2, 3))

 

posted on 2017-04-17 13:40  miss_林  阅读(108)  评论(0编辑  收藏  举报

导航