• Python中语法糖及带参语法糖


    在python中,@符号常被称作语法糖(装饰器),在某函数定义时,用以包装该函数,以达到截取,控制该函数的目的。

    def d(f):
    	print('d...')
    	k=f                         #此处保留了传进来的原函数 f
    	def f(x):
    		return k(x)*2
    	return f                    #此处不能写成f(x),f是函数句柄,如果带(),则调用,这里只返回句柄。
    @d
    def e(x):
    	return x**2
    print(e(3))

     比如上面代码,@d,就等价于e=d(e),d(e)的返回值为f,f在d中是一个函数句柄,e也是一个函数句柄,返回值是正确的,但经过语法糖后,此时的e不再是原来的e,而是d返回的f,再调用e(x),其实是调用f(x),也就是d(f)(x),通过k=f,将传进来的原函数保存至k中,以备后用。所以该装饰器的作用就是将原函数的返回值扩大2倍。

    d...
    18

    打印值如上,证明确实将原函数返回值扩大了2倍。

    语法糖也可以带参数,如下代码:

    def a(x,y):
        def b(f):
            k=f
            def f(z):
                return x*y*k(z)
            return f
        return b
    @a(2,3)
    def e(x):
        return x**2
    print(e(5))

    同样的,@a(2,3)等价于e=a(2,3)(e),说明a(x,y)应该返回一个函数句柄,并且该函数句柄需要将e函数句柄作为参数传入,而这个函数句柄就是代码中的b,也就是说真正的装饰器是b,然后在b中,通过k=f,将传入的原函数句柄保存起来,当调用被包装后的e时,实际是调用了f,而f返回x*y*k(z),即将原函数返回值扩大x*y倍后,再返回。

    150
    ##### 愿你一寸一寸地攻城略地,一点一点地焕然一新 #####
  • 相关阅读:
    单div绘制多元素图
    js笔试题系列之二——数组与对象
    JS设计模式——策略模式
    js笔试题系列之三——函数
    zepto.js中的Touch事件
    java定时任务之Scheduled注解
    汤姆大叔送书,咱也科学抢书
    Asp.net Mvc自定义客户端验证(CheckBox列表的验证)
    摆脱烂项目
    我的ORM发展史
  • 原文地址:https://www.cnblogs.com/johnyang/p/12173751.html
Copyright © 2020-2023  润新知