8.1【装饰器】使用函数装饰器

文章介绍了如何使用Python装饰器来优化斐波那契数列和爬楼梯问题的算法,通过添加缓存功能避免重复计算,提高效率。装饰器允许在不修改原有函数代码的情况下,为函数添加额外的功能,如计时、日志记录或缓存结果。
摘要由CSDN通过智能技术生成
为多个函数,统一添加某种功能,比如计时统计,记录日志,缓冲运算结果等待;不想在每个函数内都添加完全相同的代码,解决方案:使用装饰器
#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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值