为多个函数,统一添加某种功能,比如计时统计,记录日志,缓冲运算结果等待;不想在每个函数内都添加完全相同的代码,解决方案:使用装饰器
#coding:utf8
#[题目1] 斐波那契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1,1,2,3,5,8,13,21...
这个数列从第三项开始,每一项都等于前两项之和,求数列第n项
def fibonacci(n):
if n<= 1:
return 1
return fibonacci(n-1)+fibonacci(n-2)
# 递归,存在大量重复计算,浪费效率
#[题目2] 一个共有10个台阶的楼梯,从下面走到上面,一次只能迈1-3个台阶,且不后退,走完楼梯有多少种方法
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
# 1+1+8,2+8;存在大量重复;
解决方案:给每个函数增加缓存,每次计算,先去缓存中找,找到返回,找不到再计算并把结果放入缓存中
def fibonacci(n, cache=None):
if cache is None:
cache = {}
if n in cache:
return cache[n]
if n<= 1:
return 1
cache[n] = fibonacci(n-1, cache)+fibonacci(n-2, cache)
return cache[n]
# 还要为题目2增加类似逻辑;新增一个包裹函数,cache功能放入,并调用fibonacci函数
# 定义装饰器函数,用来生成一个在原函数基础添加了新功能的函数,替代原函数
def memo(func):
cache = {}
def wrap(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return wrap
def fibonacci(n):
if n<= 1:
return 1
return fibonacci(n-1)+fibonacci(n-2)
fibonacci = memo(fibonacci)
print fibonacci(50)
python提供等价的语法糖
@memo
def fibonacci(n):
if n<= 1:
return 1
return fibonacci(n-1)+fibonacci(n-2)
print fibonacci(50)
@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 climb(10,(1,2,3))