標籤:本質 因此 實參 分享圖片 實現 int 直接 div img
本節內容
- 迭代器&產生器
- 裝飾器
- Json & pickle 資料序列化
- 軟體目錄結構規範
- 作業:ATM項目開發
1.裝飾器(文法糖)
定義:本質是函數,(裝飾其他函數),就是為其他函數添加附加功能
原則:
- 不能修改被裝飾函數的原始碼
- 不能修改被裝飾函數的調用方式
實現裝飾器“知識”儲備:
1.函數即“變數”
2.高階函數
a.把一個函數名當作實參傳給另一個函數(在不修改被裝飾函數原始碼的情況下為其添加功能)
def bar(): print("in the bar")def test1(func): #test1(bar) print(func) func() #相當於bar()test1(bar) #此時相當於 func=bar--------輸出--------<function bar at 0x05604300>in the bar
1 import time 2 def bar(): 3 time.sleep(3) 4 print("in the bar") 5 def deco(func): 6 start_time=time.time() 7 func() 8 stop_time=time.time() 9 print("the func run time is %s"%(stop_time-start_time))10 deco(bar) #但是其實這個例子不合適,因為改變了調用方式11 #bar() 這才是原來的調用方式12 13 ------輸出-----14 in the bar15 the func run time is 3.0007259845733643舉例
b.傳回值包含函數名(不修改函數調用方式)
1 def bar(): 2 print("in the bar") 3 def deco(func): #func=bar 4 print(func) #列印bar的記憶體位址 5 return func #再返回bar的記憶體位址 6 #記憶體位址+()就能運行 7 8 deco(bar) #把記憶體位址即函數名傳給deco 9 print("----分割線---")10 print(deco(bar)) #把return傳回值列印出來11 print("------||------")12 deco(bar()) #把傳回值傳給deco,不符合高階函數的定義13 14 ----------輸出------15 <function bar at 0x058C4228>16 ----分割線---17 <function bar at 0x058C4228>18 <function bar at 0x058C4228>19 ------||------20 in the bar21 NoneView Code
因此,可以得到在不改變調用方式的情況下的做法
def bar(): print("in the bar")def deco(func): #func=bar print(func) #列印bar的記憶體位址 return func #再返回bar的記憶體位址 #記憶體位址+()就能運行bar=deco(bar) #將return返回的值賦值給barbar() #此時bar為記憶體位址,所以bar+()就能運行bar這個函數------輸出-----<function bar at 0x05814150>in the bar
3.嵌套函數
定義:在函數體內,用def去聲明一個新的函數。而不是去調用他
def foo(): print("in the foo") def bar(): print("in the bar/") bar() #局部變數只能在局部函數內調用foo()‘‘‘def foo(): bar() #這種是直接調用‘‘‘-------輸出----in the fooin the bar/
4.高階函數+嵌套函數==》裝飾器
匿名函數
def plus(n): #函數名plus return n+1 plus2 = lambda x:x+1 #沒有函數名字,只有變數名#但是兩者得到的結果是一樣的#lambda x:x+1 起了個名字叫plus2,相當於def plus2(x)
Python之路,Day4 - Python基礎4