Python基礎(7)閉包函數、裝飾器
阿新 • • 發佈:2017-08-16
是我 ron 源代碼 開放封閉原則 不能 函數嵌套 嵌套 源碼 cnblogs
一、閉包函數
閉包函數:1、函數內部定義函數,成為內部函數, 2、改內部函數包含對外部作用域,而不是對全局作用域名字的引用 那麽該內部函數成為閉包函數#最簡單的無參閉包函數 def func1() name=‘ares‘ def func2() print(name) #有參和返回值的閉包函數 def timmer(func): def wrapper(*args,**kwargs): start_time = time.time() res=func(*args,**kwargs) stop_time=time.time() print(‘run time is %s‘ %(stop_time-start_time)) return res return wrapper
二、高階函數
1)函數接收的參數是一個函數名 2)函數的返回值是一個函數名 3)滿足上述條件任意一個,都可稱之為高階函數#高階函數應用1:把函數當做參數傳給高階函數 import time def foo(): print(‘from the foo‘) def timmer(func): start_time=time.time() func() stop_time高階函數總結 1.函數接收的參數是一個函數名 作用:在不修改函數源代碼的前提下,為函數添加新功能, 不足:會改變函數的調用方式 2.函數的返回值是一個函數名 作用:不修改函數的調用方式 不足:不能添加新功能 三、函數嵌套=time.time() print(‘函數%s 運行時間是%s‘ %(func,stop_time-start_time)) timmer(foo) #總結:我們確實為函數foo增加了foo運行時間的功能,但是foo原來的執行方式是foo(),現在我們需要調用高階函數timmer(foo),改變了函數的調用方式 #高階函數應用2:把函數名當做參數傳給高階函數,高階函數直接返回函數名 import time def foo(): print(‘from the foo‘) def timmer(func): start_time=time.time() returnfunc stop_time=time.time() print(‘函數%s 運行時間是%s‘ %(func,stop_time-start_time)) foo=timmer(foo) foo() #總結:我們確實沒有改變foo的調用方式,但是我們也沒有為foo增加任何新功能
#函數的嵌套定義 def f1(): def f2(): def f3(): print(‘from f3‘) print(‘from f2‘) f3() print(‘from f1‘) f2() # print(f1) f1() ‘‘‘ from f1 from f2 from f3 ‘‘‘
四、裝飾器
1、定義: 器即函數 裝飾即修飾,意指為其他函數添加新功能 裝飾器定義:本質就是函數,功能是為其他函數添加新功能 2、裝飾器遵循的原則:開放封閉原則(對擴展是開放的,對源碼修改是封閉的) 即、1)不修改被裝飾函數的源代碼 2)為被裝飾函數添加新功能後,不修改被裝飾函數的調用方式 3、裝飾器,裝飾器本質可以是任意可調用對象,被裝飾的對象也可以是任意可調用對象, 裝飾器的功能是:在不修改被裝飾對象源代碼以及調用方式的前提下為期添加新功能 裝飾器=高階函數+函數嵌套+閉包 基本框架#這就是一個實現一個裝飾器最基本的架子 def timer(func): def wrapper(): func() return wrapper
統計一個函數運行時間的裝飾器
# import time # import random # #裝飾器 # def timmer(func): # # func=index # def wrapper(): # start_time = time.time() # func() #index() # stop_time=time.time() # print(‘run time is %s‘ %(stop_time-start_time)) # return wrapper # #被裝飾函數 # def index(): # time.sleep(random.randrange(1,5)) # print(‘welecome to index page‘) # # def home(): # time.sleep(random.randrange(1,3)) # print(‘welecome to HOME page‘) # # index=timmer(index) #index=wrapper # home=timmer(home) # # index() #wrapper() # home()
裝飾器的語法:在被裝飾對象的正上方的單獨一行,@裝飾器名字,[email protected]=timmer(index)
import time import random #裝飾器 def timmer(func): def wrapper(): start_time = time.time() func() stop_time=time.time() print(‘run time is %s‘ %(stop_time-start_time)) return wrapper #被裝飾函數 @timmer #index=timmer(index) def index(): time.sleep(random.randrange(1,5)) print(‘welecome to index page‘) # @timmer #home=timmer(home) # def home(): # time.sleep(random.randrange(1,3)) # print(‘welecome to HOME page‘) index() #wrapper() # home()
加多個裝飾器:
#加多個裝飾器 import time import random #裝飾器 def timmer(func): def wrapper(): start_time = time.time() func() stop_time=time.time() print(‘run time is %s‘ %(stop_time-start_time)) return wrapper def auth(func): def deco(): name=input(‘name: ‘) password=input(‘password: ‘) if name == ‘egon‘ and password == ‘123‘: print(‘login successful‘) func() #wrapper() else: print(‘login err‘) return deco #被裝飾函數 #多個裝飾函數,從上往下添加,調用時從下往上 @auth #index=auth(wrapper) #index=deco #index=auth(wrapper) #index=deco @timmer #index=timmer(index) #index=wrapper def index(): # time.sleep(random.randrange(1,5)) time.sleep(3) print(‘welecome to index page‘) def home(): time.sleep(random.randrange(1,3)) print(‘welecome to HOME page‘) # index() #deco() # home()
裝飾器修訂:
#裝飾器修訂 import time import random #裝飾器 def timmer(func): def wrapper(*args,**kwargs): start_time = time.time() res=func(*args,**kwargs) #接收參數 stop_time=time.time() print(‘run time is %s‘ %(stop_time-start_time)) return res #增加返回值 return wrapper #被裝飾函數 @timmer def index(): time.sleep(random.randrange(1,5)) print(‘welecome to index page‘) @timmer def home(name): time.sleep(random.randrange(1,3)) print(‘welecome to %s HOME page‘ %name) return 123123123123123123123123123123123123123123 index() res1=index() print(‘index return %s‘ %res1) res2=home(‘egon‘) #wraper() print(‘home return %s‘ %res2)
Python基礎(7)閉包函數、裝飾器