Coding机器人 2018-12-26 11:54 采纳率: 50%
浏览 946
已采纳

Python返回函数不理解之处

看代码:

def fun1(f):
    def fun2(*args):
        f(*args)
    return fun2

@fun1
def add(a,b):
    return a+b

这个代码意思我已经理解了
我只是不理解为什么要这么写.

  • 第一个不理解在fun1中,为什么函数内部还有一个函数,这样做有什么优势? 我要调用fun2可以直接就在需要的地方直接调用fun2了,这个写法我觉得有点莫名其妙. > 就像这段代码只为了得到一个函数,而后又去调用这个函数,我需要的时候直接调用sum函数不就好了..外面这个有什么必要?:
def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>
>>> f()
25
  • 第二个不理解,@fun1这个写法有什么必要性吗?在我看来有点多余,反而让代码更加不易于阅读. > 求大神指点一下,我可是学Python这个玩意遇到了很多莫名其妙的问题,以后整理一下,还有很多很多不理解的地方..
  • 写回答

3条回答

  • _ether 2018-12-26 08:36
    关注

    这个东西叫做装饰器,装饰器的基本逻辑是闭包,不是为了调用内函数而这样写,实际上是为了在不改变原函数逻辑功能的情况下添加新功能
    就基础而言,最常用来举例的是计算函数的运行时间,在内函数的前后可以添加打印时间、计算花费时间的代码
    那想要计算时间的时候直接调用装饰器就可以了,不想计算的时候注释掉这一行,这样会更简便

    def fun1(f):
        #可添加其他功能代码
        def fun2(*args):
            f(*args)
        #可添加其他功能代码
        return fun2
    
    @fun1
    def add(a,b):
        return a+b
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已采纳回答 11月21日

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog