Python储备知识与装饰器
生活随笔
收集整理的這篇文章主要介紹了
Python储备知识与装饰器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
儲備知識:
1、 *args, **kwargs
def index(x,y):print(x,y)def wrapper(*args,**kwargs):index(*args,**kwargs) #wrapper(222,111)2、名稱空間與作用域:名稱空間的的"嵌套"關系是在函數定義階段,即會檢測語法的錯誤
def func():print(x)x = 111func()3、函數對象:
- 可以把函數當做參數傳入
- 可以把函數當做返回值返回
4、函數的嵌套定義:
def outter(func):def wrapper():passreturn wrapper閉包函數
def outter():x = 0def wrapper():nonlocal xx += 1return xreturn wrapperwrapper = outter() print(wrapper())傳參的方式一:通過參數的形式為函數體傳值
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def wrapper(x):print(1)print(2)print(3)xwrapper(1) wrapper(2) wrapper(3傳參的方式二:通過閉包的方式為函數體傳值
def outter(x):def wrapper():print(1)print(2)print(3)xreturn wrapperwrapper=outter(1) print(wrapper())裝飾器:裝飾器指的定義一個函數,該函數是用來為其他函數添加額外的功能
開放封閉原則
- 開放:指的是對拓展功能是開放的
- 封閉:指的是對修改源代碼是封閉的
解決方案一:失敗
問題:沒有修改被裝飾對象的調用方式,但是修改了其源代碼
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' import timedef index(x,y):start=time.time()time.sleep(3)print('index %s %s' %(x,y))stop = time.time()print(stop - start)index(111,222)解決方案二:失敗
問題:沒有修改被裝飾對象的調用方式,也沒有修改了其源代碼,并且加上了新功能
但是代碼冗余
解決方案三:失敗
問題:解決了方案二代碼冗余問題,但帶來一個新問題即函數的調用方式改變了
import timedef index(x,y):time.sleep(3)print('index %s %s' %(x,y))def wrapper():start=time.time()index(111,222)stop=time.time()print(stop - start)wrapper()方案三的優化一:將index的參數寫活了
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' import timedef index(x,y,z):time.sleep(3)print('index %s %s %s' %(x,y,z))def wrapper(*args,**kwargs):start=time.time()index(*args,**kwargs) stop=time.time()print(stop - start)wrapper(3333,4444,5555)方案三的優化二:在優化一的基礎上把被裝飾對象寫活了,原來只能裝飾index
import timedef index(x,y,z):time.sleep(3)print('index %s %s %s' %(x,y,z))def home(name):time.sleep(2)print('welcome %s to home page' %name)def outter(func):def wrapper(*args,**kwargs):start=time.time()func(*args,**kwargs) stop=time.time()print(stop - start)return wrapperindex=outter(index) home=outter(home)方案三的優化三:將wrapper做的跟被裝飾對象一模一樣,以假亂真
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' import timedef index(x,y,z):time.sleep(3)print('index %s %s %s' %(x,y,z))def home(name):time.sleep(2)print('welcome %s to home page' %name)def outter(func):def wrapper(*args,**kwargs):start=time.time()res=func(*args,**kwargs)stop=time.time()print(stop - start)return resreturn wrapperhome=outter(home)語法糖:在被裝飾對象正上方的單獨一行寫@裝飾器名字
import time # 裝飾器 def timmer(func):def wrapper(*args,**kwargs):start=time.time()res=func(*args,**kwargs)stop=time.time()print(stop - start)return resreturn wrapper@timmer def index(x,y,z):time.sleep(3)print('index %s %s %s' %(x,y,z))@timmer def home(name):time.sleep(2)print('welcome %s to home page' %name)index(x=1,y=2,z=3) home('egon')總結無參裝飾器模板
def outter(func):def wrapper(*args,**kwargs):# 1、調用原函數# 2、為其增加新功能res=func(*args,**kwargs)return resreturn wrapper總結
以上是生活随笔為你收集整理的Python储备知识与装饰器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python教程:有参装饰器
- 下一篇: Python文件操作中进行字符串替换(保