3.24作业
作业
1、编写课上讲解的有参装饰器准备明天默写
import time
login_user=None
def auth(db_type='file'):
def deco(func):
def wrapper(*args, **kwargs):
global login_user
if db_type == 'file':
if login_user:
res = func(*args, **kwargs)
return res
else:
login() #调用登录函数,登录成功login_user=登录账户
elif db_type == 'mysql':
print('基于mysql的认证')
res = func(*args, **kwargs)
return res
elif db_type == 'ldap':
print('基于ldap的认证')
res = func(*args, **kwargs)
return res
else:
print('不支持db_type认证')
return wrapper
return deco
@auth(db_type='file')
def index(x, y):
time.sleep(2)
print(f'inde {x} {y}')
@auth(db_type='mysql')
def home(name):
time.sleep(2)
print(f'这是{name}的家')
@auth(db_type='ldap')
def transfer():
time.sleep(2)
print('转账')
index(1, 2)
home('egon')
transfer()
2:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作
def deco2(key):
def deco1(func):
def wrapper(*args, **kwargs):
with open('a.txt', mode='rt', encoding='utf-8') as f1:
dic = eval(f1.read().strip())
res = func(*args, **kwargs)
dic[key] = res
with open('a.txt', mode='r+', encoding='utf-8') as f2:
str1 = str(dic)
f2.write(str1)
return res
return wrapper
return deco1
@deco2(key='k1')
def add(x, y):
res = str(x + y)
print(f'{x}+{y}={res}')
return res
@deco2(key='k2')
def sub(x, y):
res = str(x - y)
print(f'{x}-{y}={res}')
return res
@deco2(key='k3')
def muti(x, y):
res = str(x * y)
print(f'{x}x{y}={res}')
return res
@deco2(key='k4')
def divi(x, y):
res = str(x / y)
print(f'{x}除以{y}={res}')
return res
add(1, 1)
sub(3, 1)
muti(2, 1)
divi(4, 2)
#文件a.txt初内容:
{}
#运行函数后文件a.txt内容:
{'k1': '2', 'k2': '2', 'k3': '2', 'k4': '2.0'}
3、 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定
注意:时间格式的获取
import time
time.strftime('%Y-%m-%d %X')
import time
def log(plan):
def deco(func):
def wrapper(*args, **kwargs):
res = time.strftime('%Y-%m-%d %X')
print(res)
res1 = func(*args, **kwargs)
return res1
return wrapper
return deco
@log(plan='学python')
def schedule(plan):
time.sleep(2)
print(f'此刻我绝对了我要{plan}')
schedule('玩玩玩!')
schedule('还是学点东西吧!')
4、基于迭代器的方式,用while循环迭代取值字符串、列表、元组、字典、集合、文件对象
# 字符串:
str1 = 'abcd'
res = str1.__iter__()
while True:
try:
print(next(res))
except StopIteration:
break
# 列表:
list1 = [1, 2, 3, 4]
res = list1.__iter__()
while True:
try:
print(next(res))
except StopIteration:
break
# 元组:
tuple1 = (1, 2, 3, 4)
res = tuple1.__iter__()
while True:
try:
print(next(res))
except StopIteration:
break
# 字典:
dic1 = {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}
res = dic1.__iter__()
while True:
try:
print(next(res)) # 取出的是字典的key
except StopIteration:
break
# 集合:
set1 = {1, 2, 3, 4}
res = set1.__iter__()
while True:
try:
print(next(res))
except StopIteration:
break
# 文件对象:
with open('a.txt', mode='rt', encoding='utf-8') as f1:
f1.__iter__()
res = f1.__iter__()
while True:
try:
print(next(res),end='')
except StopIteration:
break
#文件a.txt内容:
1
2
3
4
5、自定义迭代器实现range功能
def range1(start, stop, step=1):
while start < stop:
yield start
start += step
for i in range1(1, 10, 2):
print(i)