1 # def wrapper(func): 2 # def inner(*args,**kwargs): 3 # print('再被装饰之前要做的事') 4 # ret = func(*args,**kwargs) 5 # print('再被装饰之后要做的事') 6 # return ret 7 # return inner 8 # 9 # @wrapper 10 # def holiday(day): 11 # print('全体放假%s天'%day) 12 # return '好开心!' 13 14 # ret = holiday(8) 15 # print(ret) 16 17 18 # 练习题 19 # 1,编写装饰器,为多个函数加上认证的功能(用户的账号和密码来 20 # 源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码 21 # FLAG = False 22 # def login(func): 23 # def inner(*args,**kwargs): 24 # global FLAG 25 # '''登录程序''' 26 # if FLAG: 27 # ret = func(*args, **kwargs) 28 # return ret 29 # else: 30 # username = input("username:") 31 # password = input("password:") 32 # if username == "zhizhu" and password == "123": 33 # FLAG = True 34 # ret = func(*args,**kwargs) 35 # return ret 36 # else: 37 # print("登录失败,请重新输入!") 38 # return inner 39 # 40 # @login 41 # def shoplist_add(): 42 # print('增加一件物品') 43 # 44 # @login 45 # def shoplist_del(): 46 # print('删除一件物品') 47 # 48 # shoplist_add() 49 # shoplist_del() 50 51 52 53 # 2.编写装饰器,为多个函数加上记录调用功能,要求每次调用函数 54 # 都将 被调用的函数名称写入文件 55 56 # def log(func): 57 # def inner(*args,**kwargs): 58 # with open('log','a',encoding='utf-8') as f: 59 # f.write(func.__name__+'\n') 60 # ret = func(*args,**kwargs) 61 # return ret 62 # return inner 63 # 64 # @log 65 # def shoplist_add(): 66 # print("增加一件物品") 67 # 68 # @log 69 # def shoplist_del(): 70 # print("删除一件物品") 71 # 72 # shoplist_add() 73 # shoplist_del() 74 75 76 # 如果你不需要用装饰器,如下实现 77 # 在原有函数下再写一个函数,def timmer_out(flag): 进行判断 78 # 如果是Ture,执行装饰器功能,False,不执行 79 # import time 80 # FLAGE = True 81 # def timmer_out(flag): 82 # def timmer(func): 83 # def inner(*args,**kwargs): 84 # if flag: 85 # start = time.time() 86 # ret = func(*args,**kwargs) 87 # end = time.time() 88 # print(end-start) 89 # return ret 90 # else: 91 # ret = func(*args, **kwargs) 92 # return ret 93 # return inner 94 # return timmer 95 # 96 # @timmer_out(FLAGE) # 先执行timmer_out 返回timmer 传给了@timmer_out,也就是说现在的@timmer_out == @timmer 97 # def wahaha(): 98 # time.sleep(0.1) 99 # print('蜘蛛蜘蛛')100 #101 # @timmer_out(FLAGE)102 # def niulanshan():103 # time.sleep(0.1)104 # print('老虎老虎')105 # wahaha()106 # niulanshan()107 108 109 # 多个装饰器装饰同一个函数110 """111 1,先执行@wrapper2 func()之前的112 2,在执行@wrapper1 func()之前的113 3,在执行func()这个函数114 4,在执行@wrapper1 func()之后的115 5,在执行@wrapper2 func()之后的116 117 执行完的结果118 wrapper2, before func119 wrapper1, before func120 in f121 wrapper1, after func122 wrapper2, arter func123 """124 # def wrapper1(func):125 # def inner1():126 # print('wrapper1, before func')127 # func()128 # print('wrapper1, after func')129 # return inner1130 #131 # def wrapper2(func):132 # def inner2():133 # print('wrapper2, before func')134 # func()135 # print('wrapper2, arter func')136 # return inner2137 #138 # @wrapper2139 # @wrapper1140 #141 # def f():142 # print('in f')143 #144 # f()145 146 147 148 # 迭代器149 # 迭代器的概念150 # 只要含有 __iter__方法的都是可迭代的 --可迭代协议151 # 迭代器的协议 -- 内部含有__next__和 __iter__方法的就是迭代器152 153 # 可以被for循环的都是可迭代的154 # 可迭代的内部都有__iter__方法155 # 只要是迭代器 一定可迭代156 # 可迭代的.__iter__()方法就可以得到一个迭代器157 # 迭代器中的__next__()方法可以一个一个的获取值158 159 # from collections import Iterable160 # from collections import Iterator161 # print(isinstance([],Iterator)) # isinstance 判断是否是可迭代对象162 # print(isinstance([],Iterable))163 164 # 迭代器的好处:165 # 从容器类型中一个一个的取值,会把所有的值都取到166 # 节省内存空间167 # 迭代器并不会在内存中再占用一大块内存168 # 而是随着循环 每次生成一个169 # 每次next 每次给我一个170 171 172 # 生成器173 # 生成器函数 --- 本质上就是我们自己写的函数174 175 # def generator():176 # print(1)177 # return 'a'178 #179 # ret = generator()180 # print(ret)181 182 # 只要含有yield关键字的函数 都是生成器函数183 # yield只能写在函数内部。184 # yield 与 return 不能共用185 # def generator():186 # print(1)187 # yield 'a'188 189 # ret = generator()190 # print(ret)191 # print(ret.__next__())192 193 194 # def generator():195 # print(1)196 # yield 'a'197 # print(2)198 # yield 'b'199 # g = generator()200 # ret = g.__next__()201 # print(ret)202 203 # 注:本文是根据老男孩课程内容整理而成的,本文仅供个人笔记使用,如果有侵犯,请联系我,我立即撤销。