当前位置:
首页 > Python基础教程 >
-
2020Python作业15——装饰器2+迭代器
作业:
1、编写课上讲解的有参装饰器
def auth(db_type = 'file'): def inner(func): def wrapper(*args, **kwargs): inp_name = input("your name:").strip() inp_pwd = input("your password:").strip() if db_type == 'file': with open(r'db.txt', 'rt', encoding='utf-8') as f: for line in f: user, pwd, *_ = line.strip().split(':') if inp_name == user and inp_pwd == pwd: print('文件认证登录成功') return func(inp_name) else: print('用户名密码错误') elif db_type == 'mysql': func() elif db_type == 'ldap': func() else: print('该认证登录方式不存在') return wrapper return inner @auth(db_type='file') def index(name): print('welcome 【%s】' % name) @auth(db_type='mysql') def mysql_login(): print('mysql认证') @auth(db_type='ldap') def ldap_login(): print('ldap认证') index() mysql_login() ldap_login()
2:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法——
在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作
d = {} key = 0 def add_dict(func): def wrapper(*args, **kwargs): global key d['{}'.format(key)] = func key += 1 return wrapper @add_dict def index(): pass @add_dict def home(): pass index() home() print(d)
3、 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定
注意:时间格式的获取
import time
time.strftime('%Y-%m-%d %X')
import time import os def logger(logfile): def deco(func): if not os.path.exists(logfile): with open(logfile,'w'):pass def wrapper(*args,**kwargs): res=func(*args,**kwargs) with open(logfile,'a',encoding='utf-8') as f: f.write('%s %s run\n' %(time.strftime('%Y-%m-%d %X'),func.__name__)) return res return wrapper return deco @logger(logfile='milimili.log') def index(): print('index') index()
4、基于迭代器的方式,用while循环迭代取值字符串、列表、元组、字典、集合、文件对象
def wrapper(inp_type): print('输出内容为: {}'.format(type(inp_type))) while True: try: print(next(inp_type)) except StopIteration: break wrapper('123'.__iter__()) wrapper([1,2,3].__iter__()) wrapper((1,2,3).__iter__()) wrapper({'k1':1,'k2':2}.__iter__()) wrapper({1,2,3}.__iter__()) with open('a.txt', 'rt', encoding='utf-8') as f: wrapper(f.__iter__())
5、自定义迭代器实现range功能
def my_range(start, stop, step=1): while start < stop: start += step yield start for i in my_range(0,5): print(i-1)
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式