python基础复习 11
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 func 119 wrapper1, before func 120 in f 121 wrapper1, after func 122 wrapper2, arter func 123 """ 124 # def wrapper1(func): 125 # def inner1(): 126 # print('wrapper1, before func') 127 # func() 128 # print('wrapper1, after func') 129 # return inner1 130 # 131 # def wrapper2(func): 132 # def inner2(): 133 # print('wrapper2, before func') 134 # func() 135 # print('wrapper2, arter func') 136 # return inner2 137 # 138 # @wrapper2 139 # @wrapper1 140 # 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 Iterable 160 # from collections import Iterator 161 # 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 # 注:本文是根据老男孩课程内容整理而成的,本文仅供个人笔记使用,如果有侵犯,请联系我,我立即撤销。