1.装饰器
1什么是装饰器
(相关资料图)
装饰器就是装饰别人的工具,具体是指为被装饰者添加新功能,为一个新函数添加新功能
2为何要用装饰器 (开放封闭原则)
为了不修改被装饰者的源代码以及调用方式的前提下,为被装饰着添加新功能
3如何实现装饰器
通过这个模板来实现具体看实际情景添加一些代码
def outter(func):def wrapper(*args,**kwargs): res=func(*args,**kwargs) return resreturn wrapper
2.装饰器语法糖
就是在被装饰函数头放一个@outter装饰者函数名字 等同于把outter返回值为wrapper内存地址 wrapper内存地址给index从新赋值
def outter(func): #最原始的index的内存地址 def wrapper(*args,**kwargs): #形参 *与**原封不动给func res=func(*args,**kwargs) #获取返回值为func的return 有就返回,没有就返回None return res #返回值为func的return 有就返回,没有就返回None return wrapper #返回wrapper的内存地址@outter 等同于 index=outter(index) wrapper内存地址赋值给index **这就是语法糖**def index (x,y): print("我是index",x,y) return 123 #返回值1 2 3print(index(1,2)) #调用index实际是调用wrapper(形参)
3.装饰器模板
def outter(func): def wrapper(*args,**kwargs): #形参 *与**原封不动给func res=func(*args,**kwargs) #获取返回值为func的return 有就返回,没有就返回None return res #返回值为func的return 有就返回,没有就返回None return wrapper #返回wrapper的内存地址#@outter # 等同于 index=outter(index) wrapper内存地址赋值给index,index内存地址被重新赋值def index (x,y): print("我是index",x,y) return 123 #返回值1 2 3print(index) #.wrapper at 0x000001AD182EA790> 相当于调用wrapperprint(index(1,2)) #调用index实际是调用wrapper(形参)
这个装的更像
上面的help方法获取的还是wrapper
内存地址还是wrapper
这个全部都是index
from functools import wrapsdef outter(func): @wraps(func) def wrapper(*args, **kwargs): start = time.time() res = func(*args, **kwargs) stop = time.time() print(stop - start) return res return wrapper@outter # index = outter(index)def index(x, y, z): """index函数的文档注释""" print("welcome to index page", x, y) time.sleep(3) return 123res = index(111, 222, 333)print(res) #index里面的输出语句 welcome too.....print(index) #输出index的内存地址 @wraps模仿的 把index 内存地址都换过来了help(index) #输出index的注释文档信息 @wraps模仿的 把index注释都换过来了
4.迭代器
1 什么是迭代器
迭代器指的是迭代取值的工具
什么是迭代???
- 迭代是一个重复的过程,但是每一次重复都是基于上一次结果而继续的
- 比如 一个项目 第一个人做了一半 第二个人接着第一个人继续做,
2 为何要用迭代器
为了找到一种统一迭代取值方案(适用于str、list、tuple、dict、set,文件对象)
节省内存
3 如何用迭代器
可迭代的对象iterable:
- 内置有
__iter__
方法的对象(str、list、tuple、dict、set,文件对象) 除了int float 都可以迭代 - 有
__iter__
方法的就是可迭代对象 - 有
_next_
方法的就是迭代器对象
迭代器对象一定是 可迭代的可迭代对象不一定是迭代对象
迭代器对象iterator:
- 内置有__iter__方法
- 内置有__next__方法
4.总结for循环好用 for循环就是迭代器
例子
dic = {"k1": 1111, "k2": 2222, "k3": 3333,"k4":4444,"k5":5555}iter_dic = iter(dic) #dic通过tier转换一下,成迭代器对象iter_dic.__next__() #有next方法print(iter_dic.__iter__().__iter__().__iter__() is iter_dic) 已经是迭代器对象,在调iter也没用还是之前的对象while True: try: #捕捉异常 print(next(iter_dic)) #next循环下一个 except StopIteration: breakfor x in dic: #总结 for循环好用 for循环就是迭代器循环 print(x)
例:
dic = {"k1": 1111, "k2": 2222, "k3": 3333,"k4":4444,"k5":5555} iter_dic = iter(dic) #迭代器取完就没了 从新获取 for k in iter_dic: #如果是dic第一次可以取到dic自动调iter方法变成迭代器对象超级赛亚人 #调迭代器对象的iter还是本身 第一次可以取到 print(k) print("="*50) # iter_dic = iter(dic) #如果打开这个 就是从新赋值 迭代器可以取到东西 for k in iter_dic: #如果再次dic调取iter方法还会变成迭代器对象,超级赛亚人所以还可以取出来 #调迭代器对象的iter还是本身第二次取不到值 print(k) -------------------------------------------------------------------------------------------------------------- with open("a.txt",mode="rt",encoding="utf-8") as f: for line in f: #f本身就是迭代器对象 调iter方法变身失败还是本身 ,然后循环赋值给line print(line)#输出line print("="*50) for line in f: #再用f.iter还是迭代器对象本身,变身失败还是本身 print(line)
5.自定义迭代器 生成器对象
# yield可以返回多次值def func(): print("hello1") print("hello1") print("hello1") yield 111 print("hello2") print("hello2") print("hello2") yield 222 print("hello3") print("hello3") print("hello3") print("hello3") yield 333 print("hello4") print("hello4") print("hello4") print("hello4")#函数内但凡出现yield语法,我们再调用函数就不会立即触发函数体代码运行,会返回一个生成器对象,生成器对象就是一种自定义的迭代器res=func() #返回一个生成器对象print(next(res)) #返回yield值