zoukankan      html  css  js  c++  java
  • 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
    ##### 愿你一寸一寸地攻城略地,一点一点地焕然一新 #####
  • 相关阅读:
    python之简单窗口
    hdu1237简单计算器
    BST二叉查找树的实现与操作
    huffman树入门
    hdu2043密码
    hdu1870愚人节的礼物
    hdu 2085 核反应堆
    hdu 2066 一个人的旅行(Dijkstra求最短路问题)
    hdu 2063 过山车 (二分匹配)
    hdu 2067 小兔的棋盘(Catalan数)
  • 原文地址:https://www.cnblogs.com/johnyang/p/12173751.html
Copyright © 2011-2022 走看看