Python基础(7)_闭包函数、装饰器
一、闭包函数
闭包函数:1、函数内部定义函数,成为内部函数,
2、改内部函数包含对外部作用域,而不是对全局作用域名字的引用
那么该内部函数成为闭包函数
1 #最简单的无参闭包函数 2 def func1() 3 name='ares' 4 def func2() 5 print(name) 6 7 #有参和返回值的闭包函数 8 def timmer(func): 9 def wrapper(*args,**kwargs): 10 start_time = time.time() 11 res=func(*args,**kwargs) 12 stop_time=time.time() 13 print('run time is %s' %(stop_time-start_time)) 14 return res 15 return wrapper
二、高阶函数
1)函数接收的参数是一个函数名
2)函数的返回值是一个函数名
3)满足上述条件任意一个,都可称之为高阶函数
1 #高阶函数应用1:把函数当做参数传给高阶函数 2 import time 3 def foo(): 4 print('from the foo') 5 6 def timmer(func): 7 start_time=time.time() 8 func() 9 stop_time=time.time() 10 print('函数%s 运行时间是%s' %(func,stop_time-start_time)) 11 timmer(foo) 12 #总结:我们确实为函数foo增加了foo运行时间的功能,但是foo原来的执行方式是foo(),现在我们需要调用高阶函数timmer(foo),改变了函数的调用方式 13 14 #高阶函数应用2:把函数名当做参数传给高阶函数,高阶函数直接返回函数名 15 import time 16 def foo(): 17 print('from the foo') 18 19 def timmer(func): 20 start_time=time.time() 21 return func 22 stop_time=time.time() 23 print('函数%s 运行时间是%s' %(func,stop_time-start_time)) 24 foo=timmer(foo) 25 foo() 26 #总结:我们确实没有改变foo的调用方式,但是我们也没有为foo增加任何新功能
高阶函数总结
1.函数接收的参数是一个函数名
作用:在不修改函数源代码的前提下,为函数添加新功能,
不足:会改变函数的调用方式
2.函数的返回值是一个函数名
作用:不修改函数的调用方式
不足:不能添加新功能
三、函数嵌套
1 #函数的嵌套定义 2 def f1(): 3 def f2(): 4 def f3(): 5 print('from f3') 6 print('from f2') 7 f3() 8 print('from f1') 9 f2() 10 # print(f1) 11 f1() 12 13 ''' 14 from f1 15 from f2 16 from f3 17 18 '''
四、装饰器
1、定义:
器即函数
装饰即修饰,意指为其他函数添加新功能
装饰器定义:本质就是函数,功能是为其他函数添加新功能
2、装饰器遵循的原则:开放封闭原则(对扩展是开放的,对源码修改是封闭的)
即、1)不修改被装饰函数的源代码
2)为被装饰函数添加新功能后,不修改被装饰函数的调用方式
3、装饰器,装饰器本质可以是任意可调用对象,被装饰的对象也可以是任意可调用对象,
装饰器的功能是:在不修改被装饰对象源代码以及调用方式的前提下为期添加新功能
装饰器=高阶函数+函数嵌套+闭包
基本框架
1 #这就是一个实现一个装饰器最基本的架子 2 def timer(func): 3 def wrapper(): 4 func() 5 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()
装饰器的语法:在被装饰对象的正上方的单独一行,@装饰器名字,#@timer就等同于index=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()
加多个装饰器:
1 #加多个装饰器 2 import time 3 import random 4 #装饰器 5 def timmer(func): 6 def wrapper(): 7 start_time = time.time() 8 func() 9 stop_time=time.time() 10 print('run time is %s' %(stop_time-start_time)) 11 return wrapper 12 def auth(func): 13 def deco(): 14 name=input('name: ') 15 password=input('password: ') 16 if name == 'egon' and password == '123': 17 print('login successful') 18 func() #wrapper() 19 else: 20 print('login err') 21 return deco 22 23 #被装饰函数 #多个装饰函数,从上往下添加,调用时从下往上 24 @auth #index=auth(wrapper) #index=deco #index=auth(wrapper) #index=deco 25 @timmer #index=timmer(index) #index=wrapper 26 def index(): 27 # time.sleep(random.randrange(1,5)) 28 time.sleep(3) 29 print('welecome to index page') 30 31 32 def home(): 33 time.sleep(random.randrange(1,3)) 34 print('welecome to HOME page') 35 36 # index() #deco() 37 # home()
装饰器修订:
1 #装饰器修订 2 import time 3 import random 4 #装饰器 5 def timmer(func): 6 def wrapper(*args,**kwargs): 7 start_time = time.time() 8 res=func(*args,**kwargs) #接收参数 9 stop_time=time.time() 10 print('run time is %s' %(stop_time-start_time)) 11 return res #增加返回值 12 return wrapper 13 #被装饰函数 14 15 @timmer 16 def index(): 17 time.sleep(random.randrange(1,5)) 18 print('welecome to index page') 19 @timmer 20 def home(name): 21 time.sleep(random.randrange(1,3)) 22 print('welecome to %s HOME page' %name) 23 return 123123123123123123123123123123123123123123 24 index() 25 26 res1=index() 27 print('index return %s' %res1) 28 res2=home('egon') #wraper() 29 print('home return %s' %res2)