在python中,@符號常被稱作語法糖(裝飾器),在某函式定義時,用以包裝該函式,以達到擷取,控制該函式的目的。
def d(f):print('d...')
k=f #此處保留了傳進來的原函式 f
def f(x):
return k(x)*2
return f #此處不能寫成f(x),f是函式控制代碼,如果帶(),則呼叫,這裡只返回控制代碼。
@ddef 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倍。
語法糖也可以帶引數,如下**:
defa(x,y):
defb(f):
k=fdeff(z):
return x*y*k(z)
return
f
return
b@a(2,3)
defe(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 語法糖太多 python 語法糖
匿名函式 lamda表示式 def add x,y return x y 等價於f lamda x,y x y f 1,2 三元表示式 wefx 1 y 2 c x if x map對映關係 def square x return x x list x 1,3,10 list r map squar...
Python 的 with 語法糖
python 內建了 sqlite3 模組,可以方便地呼叫 sqlite 資料庫。import sqlite3 conn sqlite3.connect test.db cur conn.cursor cur.execute create table students id bigint prima...
Python語法糖介紹
作為一門優秀的指令碼語言,python在語法層面提供了很多好玩又實用的語法,俗稱語法糖,正確的使用這些技巧能讓 看起來更優雅,更pythonic,這裡列舉幾個。usr bin env python3 defmain animals cat dog bird pig if dog in animals...