装饰器:本质是函数,用来装饰其他的函数,为其它函数添加附加功能。
原则:不能改变被装饰函数的源代码和调用方式。
1、函数即‘变量’,定义一个函数相当于把函数体赋值给函数名,匿名函数相当于只有函数体没有函数名
def func1(): print('in the function') func2=func1 #和普通的整数赋值一样:a=2 b=a print(b) func2()
2、高阶函数
3、嵌套函数
装饰器=高阶函数+嵌套函数
高阶函数:
1、把一个函数名当作实参传递给另外一个函数;(在不修改被装饰函数源代码的情况下为其添加功能)
2、返回值中包含函数名。(不修改函数的调用方式)
import time def bar(): time.sleep(2) print('in the bar') def timer(func): start_time=time.time() func() stop_time=time.time() print('the time of running is %s'%(stop_time-start_time)) timer(bar) 输出: in the bar the time of running is 2.0002079010009766
import time def bar(): time.sleep(2) print('in the bar') def test(func): print(func) #如果参数是函数,则此处打印的是函数在内存中的位置信息 func() return func test(bar) #将函数名作为实参传递给调用函数 #test(bar()) #错误用法,将函数返回值传递给调用函数,不符合高阶函数定义 输出: <function bar at 0x000001717B027F28> in the bar
嵌套函数:在一个函数的函数体内定义另一个函数,不是调用,是def定义
def test(): print('in the test') def inner(): #内部函数,相当于局部变量,只能在test()内部调用 print('in the inner') inner() test() 输出: in the test in the inner
装饰器:
import time def timer(func): #嵌套函数 def decorator(*args): start_time=time.time() func(*args) stop_time=time.time() print('the running time of this function is %s'%(stop_time-start_time)) return decorator #返回函数名,不能带有括号 @timer #相当于test=timer(test),timer(test)返回decorator()函数。 def test1(): time.sleep(2) print('in the test1') @timer def test2(name,age): print('in the test2:', name, age) test1() test2('刚田武',22) 输出: in the test1 the running time of this function is 2.000319242477417 in the test2: 刚田武 22 the running time of this function is 0.0
username,password='zhhy','123' def auth(auth_type): print('auth type:',auth_type) def outer_wrapper(func): def wrapper(*args, **kwargs): print('wrapper args:',*args,**kwargs) if auth_type == 'local': user_name = input('please input your name:').strip() pass_word = input('please input your password:').strip() if username == user_name and password == pass_word: print('