1、编写课上讲解的有参装饰器准备明天默写
(1)案例1
from functools import wraps def outter(func): @wraps(func) def wrapper(*args,**kwargs): res = func(*args,**kwargs) return res return wrapper @outter def student(name,age=18): """学生资料查询""" print(name,age) return name student('姜春',age=20) print(student.__name__) print(student.__doc__)
效果如下:
姜春 20
student
学生资料查询
(2)案例2
def auth(login_type): def check_login(func): def wrapper(*args,**kwargs): if login_type == 'file': print('基于文件认证!') res = func(*args,**kwargs) elif login_type == 'mysql': print('基于数据库认证!') res = func(*args,**kwargs) elif login_type == 'ldap': print('基于ldap域认证!') res = func(*args,**kwargs) else: print('去TM,你输的什么鬼!') res = None return res return wrapper return check_login @auth('file') def student(name,age=18): print(name,age) return name @auth('mysql') def read(name,book='《python从入门到放弃》'): print(name,book) return book @auth('ldap') def openstack_desktop(name,way='GPU'): print(name,way) return way student('jiangchun') read('egon') openstack_desktop('tank')
运行效果:
基于文件认证! jiangchun 18 基于数据库认证! egon 《python从入门到放弃》 基于ldap域认证! tank GPU
2、还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作
#!/usr/bin/env python # -*- coding:utf-8 -*- from prettytable import PrettyTable user_dict = {} def outter(key): def loadname(func): user_dict[key] = [func, func.__doc__] return loadname @outter('0') def login(): """登录""" print('登录') @outter('1') def register(): """注册""" print('注册') @outter('2') def transfer(): """转账""" print('转账') @outter('3') def query(): """查询""" print('查询') @outter('4') def recharge(): """充值""" print('充值') tb = PrettyTable(field_names=['功能编号', '功能名称']) for k in user_dict: tb.add_row([k,user_dict[k][1]]) flag = True while flag: print(tb) cmd = input('请输入功能编号:').strip() if cmd.isdigit(): if cmd in user_dict: user_dict[cmd][0]() else: print('该功能尚未开发') else: print('请输入一个整数') _continue = input('是否继续选择功能(y,n):').strip() flag = False if _continue.lower() == 'n' else True
3、编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定
注意:时间格式的获取
import time
time.strftime('%Y-%m-%d %X')
import time, os from functools import wraps logfile = os.path.dirname(os.path.abspath(__file__)) + '/run.log' def loginfo(func): @wraps(func) def wrapper(*args, **kwargs): with open(logfile, mode='a', encoding='utf-8') as f: f.write('[%s]:%s is running\n' % (time.strftime('%Y-%m-%d %X'),func.__name__)) res = func(*args,**kwargs) return res return wrapper @loginfo def student(name,age=18,gender='male'): print('姓名:{}\n年龄:{}\n性别:{}'.format(name,age,gender)) return name student('姜春憨批',age=20,gender='female')
效果:
[root@Surpass day18]# cat run.log [2020-03-24 20:25:50]:student is running [2020-03-24 20:26:02]:student is running
4、基于迭代器的方式,用while循环迭代取值字符串、列表、元组、字典、集合、文件对象
(1)字符串
str_obj = 'hello world!\n' str_iter = iter(str_obj) while 1: try: print(next(str_iter)) except StopIteration: break
(2)列表
list_obj = [i for i in range(10) if i%2 == 0] list_iter = iter(list_obj) while 1: try: print(next(list_iter)) except StopIteration: break
(3)元组
tuple = (i for i in range(20) if i%2 ==1) tuple_iter = iter(tuple) while 1: try: print(next(tuple_iter)) except StopIteration: break
(4)字典
dic_obj = {'name':'egon','age':18,'gender':'male'} dic_iter = iter(dic_obj) while 1: try: print(next(dic_iter)) except StopIteration: break
(5)集合
s = {1,3,5,7,9} s_iter = iter(s) while 1: try: print(next(s_iter)) except StopIteration: break
(6)文件对象
f = open('run.log', mode='r', encoding='utf-8') f_iter = iter(f) while 1: try: print(next(f_iter)) except StopIteration: break
5、自定义迭代器实现range功能
ef my_range(start, stop, step=1): while abs(start - stop) > 0: try: yield start start += step except StopIteration: break for i in my_range(1, 8): print(i)
运行结果:
1 2 3 4 5 6 7