ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

44. 使用函数装饰器

2021-04-25 09:56:34  阅读:152  来源: 互联网

标签:return 函数 res 44 fib steps 装饰


某些时候我们想问多个函数统一添加某种功能,比如计时统计、记录日志、缓存运算结果等等。我们不想在每个函数内添加完全相同的代码,如何更好的达成目的呢?

要求:不在每个函数内添加完全相同的代码的前提下实现功能。

解决方案:

定义装饰器函数,用它生成一个在原函数基础上添加了新功能的函数,替代原函数。


  • 对于装饰器decorator:

Python的装饰器decorator本质上是一个高阶函数,它接收一个函数作为参数,然后返回一个新的函数,可以让该函数在不改动源代码的情况下增加其他新功能。

Python通过一个语法糖@符号来使用decorator,这样可以避免编写f = decorate(f)这样形式的代码。所谓的语法糖便是你不使用也可以完成任务,但是使用它可以让你的代码更简洁。

对于装饰器,需要记住的就是

@decoratedef f():
    pass

其中,

@decorate   等价于  f = decorate(f)


  • 方案示例:
1. 斐波那契数列def fib(n):
    if n <= 1:
        return 1
    return fib(n-1) + fib(n-2)print(fib(50))2. 走台阶问题# 台阶有100阶,一个人每次可以走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 countprint(climb(100, (1, 2, 3)))

对于求斐波那契数列,递归过程中会反复求值,造成算法效率低;走台阶问题也是如此。

如何提高上面两函数的算法效率,可以通过装饰器函数来缓存运算结果。

def memo(func):
    cache = {}
    def wrap(*args):
        res = cache.get(args)
        if not res:
            res = cache[args] = func(*args)
        return res    return wrap

@memo               #等价于 fib = memo(fib)def fib(n):
    if n <= 1:
        return 1
    return fib(n-1) + fib(n-2)print(fib(50))@memo               #等价于 climb = memo(climb)def climb(n, steps):
    count = 0
    if n == 0:
        count = 1
    elif n > 0:
        for step in steps:
            count += climb(n-step, steps)
    return countprint(climb(100, (1, 2, 3)))

结果:

20365011074
180396380815100901214157639

有了装饰器函数装饰之后,会很快得到运算结果,大大提高了算法效率。


标签:return,函数,res,44,fib,steps,装饰
来源: https://blog.51cto.com/u_10272167/2730225

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有