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 # 注:本文是根据老男孩课程内容整理而成的,本文仅供个人笔记使用,如果有侵犯,请联系我,我立即撤销。