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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM