這裡用來記錄python各種甜得發膩的語法糖,以及各種變形用法。
太初,神諭(pythonic),import light,於是有了光。
裝飾器是用來給函式增加新功能的,對於支援高階函式的語言,函式引數直接穿進去就好了。但是python提供了更為優雅的解決方案,只需要乙個@就能搞定。
裝飾器函式需要單獨寫出來,兩層,第一層接受乙個函式function就可以了,第二層構造乙個函式來接受function的引數然後再內部完成需要新增的功能並且正確呼叫函式,然後在第一層裡返回第二層構造的這個函式。例如寫好了乙個很蛋疼的**之後想測測時間……
# encoding: utf-8
import time
def timer(function):
def decorator(*args,**kwargs):
start=time.time()
return=function(*args,**kwargs)
print 'cost %s'%(time.time()-start)
return return
return decorator
@timer
def mul(row,column):
for i in xrange(row):
for j in xrange(column):
print i,j,i*j
if __name__=='__main__':
mul(100,100)
執行結果顯而易見:
99 96 9504
99 97 9603
99 98 9702
99 99 9801
cost 0.34299993515
這種直接在內部建構函式,然後將函式返回的做法,返回得到的函式具有自己的引數列表,所以也就構成了從內向外展開的結構。
然後就是在這種記憶化用法,最典型的就是那個遞迴寫法的斐波拉契,用裝飾器造乙個快取搞搞就行了……
# encoding: utf-8
import time
def memorize(function):
return={}
def decorator(*args):
if args not in return:
print args
return[args]=function(*args)
return return[args]
return decorator
@memorize
def fib(n):
if n==0:
return 1
elif n==1:
return 1
else:
return fib(n-1)+fib(n-2)
def timer(function):
def decorator(*args,**kwargs):
start=time.time()
return=function(*args,**kwargs)
print 'cost %s'%(time.time()-start)
return return
return decorator
@timer
def cal(n):
return fib(n)
if __name__ == '__main__':
cal(100)
cal(100)
可以注意到這幾個問題:
快取是全域性有效的,這個字典會一直存在,以後再次呼叫也是一樣從裡面讀取資料。這也同樣帶來乙個問題,乙個快取裝飾器只能給乙個函式用,不然會混淆。
裝飾器是在每次呼叫這個函式的時候進入,對於測時間這種我只想要乙個最後結果的東西,是不是還是需要手動用另外乙個函式啟動遞迴然後裝飾這個函式?
(未完)
Python語法糖 裝飾器
這裡用來記錄python各種甜得發膩的語法糖,以及各種變形用法。太初,神諭 pythonic import light,於是有了光。裝飾器是用來給函式增加新功能的,對於支援高階函式的語言,函式引數直接穿進去就好了。但是python提供了更為優雅的解決方案,只需要乙個 就能搞定。裝飾器函式需要單獨寫出...
Python裝飾器語法糖
裝飾器的固定格式 普通版本 def timer func def inner args,kwargs 執行函式之前要做的 ret func args,kwargs 執行函式之後要做的 return ret return inner wraps版本 from functools import wrap...
Python裝飾器(語法糖)
todo make an order defordering 第一驗證 驗證是否登入 第二驗證 驗證是否具有許可權 print 正在下訂單 todo change password defchangepwd 第一驗證 驗證是否登入 第二驗證 驗證是否具有許可權 print 修改密碼 todo sho...