# 1、编写课上讲解的有参装饰器准备明天默写
# 2:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,
# 我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,
# 完成自动添加到字典的操作
1 # func_dic = {'1': login, '2': register}
2
3
4 func_dic = {}
5
6 # 有参装饰器 x接收的是用户输入功能对应的编号
7 def outer(x): # x ---> '1'
8 # 无参装饰器
9 def wrapper(func): # func --> login, func --> register
10 func_dic[x] = func # {'1': login, '2': register}
11
12 def inner(*args, **kwargs):
13 res = func(*args, **kwargs)
14
15 return res
16
17 return inner
18
19 return wrapper
20
21
22 @outer('1') # ---> @wrapper
23 def login():
24 pass
25
26
27 @outer('2')
28 def register():
29 pass
30
31
32 print(func_dic)
# 3、 编写日志装饰器,实现功能如:一旦函数f1执行,
# 则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定
# 注意:时间格式的获取
# import time
# time.strftime('%Y-%m-%d %X')
1 import time
2
3
4 # 给被装饰对象添加执行日志装饰器
5 def add_log_wrapper(func):
6 def inner(*args, **kwargs):
7
8 # 在被装饰对象调用前的操作
9 # 1) 将被装饰对象的执行日志 写入 log.txt文件中
10 with open('log.txt', 'a', encoding='utf-8') as f:
11 now_time = time.strftime('%Y-%m-%d %X')
12 func_name = func.__name__
13 log_str = f'{now_time} {func_name} run
'
14 print(log_str)
15 f.write(log_str)
16
17 res = func(*args, **kwargs) # 被装饰对象的调用
18
19 # 在被装饰对象调用后的操作
20
21 return res
22
23 return inner
24
25
26 @add_log_wrapper
27 def f1():
28 # time.sleep(10)
29 print('我是f1函数的执行...')
30
31
32 @add_log_wrapper
33 def f2():
34 print('我是f2函数的执行')
35 # f1()
36
37 f2()
# 4、基于迭代器的方式,用while循环迭代取值字符串、列表、元组、字典、集合、文件对象
1 def my_iter(obj): # 字符串、列表、元组、字典、集合、文件
2 # 'tank'.__iter__()
3 iter_obj = obj.__iter__()
4 while True:
5 try:
6 print(iter_obj.__next__())
7
8 except StopIteration:
9 break
10
11 my_iter('tank')
# 5、自定义迭代器实现range功能
1 # res = range(1, 10, 2)
2 # print(res)
3 # print(type(res)) # <class > 都想象成一个迭代器
4
5
6 def my_range(start, end, move=1): # 10-9
7 while start < end:
8 # print(start) # 1, 3, 5, 7, 9
9 yield start
10 start += move # start += 2
11
12
13
14 res1 = range(1, 10, 2)
15 # __str__: range(1, 10, 2)
16 print(res1) # range(1, 10, 2) ---> class range()
17
18 res2 = my_range(1, 10, 2) # <generator object my_range at 0x10712e410>
19 print(res2)
20
21 for line in res1:
22 print(line)
23
24 for line2 in res2:
25 print(line2)