python3 基础(4)-装饰器、生成
- 2020 年 1 月 3 日
- 笔记
装饰器(本质:函数)
- 定义:为其他函数添加附加功能(装饰器对于被装饰函数是“透明的”、“不存在的”);执行过程:调用被装饰函数实际上是调用修饰函数
- 原则:
- 不能修改被装饰函数的源代码;
- 不能修改被装饰函数的调用方式。
- 实现装饰器的知识补充:
- 函数即“变量”:
- 调用前先定义(即要先有内存地址空间、函数的执行顺序)
- 可赋值给其他函数名
def bar(): print("in the bar") #函数bar()在以下三处位置,只有1、2处时,调用foo()才正确执行 —————————— #1# def foo(): print("in teh foo") bar() #2# foo() #3#
- 高阶函数
- 条件一:一个函数名(被装饰的函数)当作实参传给另一个函数(装饰函数);(满足原则一不修改被装饰函数的源代码)
- 条件二:返回值中包含函数名(装饰函数)。(满足原则二不修改被装饰函数的调用方式)
- 函数嵌套
- 函数即“变量”:
- 举例:
- 统计运行时间的装饰器 带无参数、固定参数、无固定参数的函数 print("分割线".center(50,"=")) import time def timmer(func): def wrapper(*args,**kwargs): start_time=time.time() res = func(*args,**kwargs) #这里的参数由wrapper函数的参数传递 stop_time=time.time() print("func run time is %s"%(stop_time-start_time)) return res #返回被装饰函数的返回值 return wrapper #返回装饰函数wrapper的内存地址 @timmer #同test1=timmer(test1); # 理解:执行timmer(test1),得到返回值wrapper内存地址,再把wrapper内存地址赋值给test1 def test1(): time.sleep(1) print("my name is test1") return "test1" @timmer #同test2=timmer(test2); # 理解:执行timmer(test2),得到返回值wrapper内存地址,再把wrapper内存地址赋值给test2 def test2(name,age): time.sleep(1) print("my name is %s,I'm %s" %(name,age)) test1() #要配合上面@timmer使用,同timmer(test1)() print(test1()) test2("chen",40) #要配合上面@timmer使用,同timmer(test2)("chen",40) print(test2("chen",40)) #结果 my name is test1 func run time is 1.000598430633545 my name is test1 func run time is 1.0012288093566895 test1 my name is chen,I'm 40 func run time is 1.0007030963897705 my name is chen,I'm 40 func run time is 1.0007030963897705 None
- 页面登录认证 无参装饰器:有参装饰器:user,passwd = "chen","123456" def auth(func): def wrapper(*args,**kwargs): username = input("Username: ").strip() password = input("Password: ").strip() if user == username and passwd == password: print("