有参装饰器,在针对账号的不同来源,还需定制不同的认证方式:
在基于不同方式认证可以在原先的两层函数上套用第三层函数,原因在于:
1、最内层的函数定义括号内带有wrapper(*args,**kwargs)是不能变更,这是为了在其内部的func是要在装饰器内找到对应原函数的值以及传值。
2、内层的外一层函数outter(func)也是不能去更变,这是对照原函数的传值设置。
3、最外层是可以增加函数用来内部判断哪种渠道可以进行认证,并且第三层最为装饰器的添加层在括号内可以无限制的添加。
import time
dic={"name":None}#用来记录账号是否登入过,以及登入后多少时间内不用重新输入账号
def suth(engine="file"):#第三层可以加无限制内容,目前加的是从哪个地方认证的登入筛选
def outter(func):
def warpper(*args,**kwargs):
if dic["name"]:
res=func(*args,**kwargs)
retiurn res
#已经登入过就不再重复输入账号密码
name = input("username:").strip()
pwd = input("password:").strip()
if engine == "file":
with open(r"E:PycharmProjectsking作业 ame.txt","r",encoding="utf-8") as f:
for k in f:#基于文件认证
k = k.strip(" ")
info= k.split(",")
if name == info[0] and pwd == info[1]:
print("login successful")
dic["name"]=name#记录用户登入状态
res=func(*args,**kwargs)
return res
else:
print("账号密码错误")
elif engine == "mode":
print("基于mode认证")
else:
print("基于其他认证来源")
return warpper
return outter
@suth(engine = "file")#suth(engine = "file")调用是进入outter
def index():
print("welcome to index")
time.sleep(2)
@suth(engine = "mode")#不同的engine 代表不同地方进入的渠道来源
def home(name):
print("welcome %s to home" %name)
time.sleep(0.5)
index()
home("yf")
迭代器:
什么是迭代器?
迭代器是一个重复过程,每一次重复都是基于上一次的结果而来的
单纯的重复并不是迭代
while True:
print('1111')
迭代:
l=['a','b','c']
def iterator(item):
i=0
while i < len(item):
print(l[i])
i+=1
为什么要迭代器:
基于索引的迭代器取值方式只适用于:列表、元组、字符串类型,而对于没有索引的字典、集合、文件则不适用。
所以必须找到一种通用并且不依赖于索引的迭代器取值方式=》迭代器
可迭代的对象在python中但反内置有__iter__方法的对象,都是可迭代的对象
迭代器对象:指的是内置有__iter__方法,又内置有__next__的方法对象。
执行可迭代对象的__tier__方法得到的就是内置的迭代器对象
执行迭代器对象的__next__得到的是迭代器的下一个值
执行迭代器对象的__iter__得到的任然是迭代器本身
#在平时中,需要先拿到可迭代对象:
info_iter=info__iter__()#加括号是变成迭代器对象
#再进行循环
while True:
try:#进行捕捉
print(info_iter.__next__())#括号运行迭代器
except stop Iteration#异常,整体进行迭代器将值运作完之后的异常捕捉
break
而for循环就是一个迭代器
在迭代对象中字符串,字典,列表,元组,集合以及文件,其中文件本身就是迭代器对象,而迭代器对象的__iter__还是迭代器,只是为了for循环统一标准。
f=open("db.txt","r")
f.__next__()执行一行文件内的内容
也可以写为next(f)
需要强调的一点迭代器对象一定是可迭代对象,反之则不然
优点:
提供一种通用的,可以不依赖索引的迭代取值方式
迭代器对象更加节省内存
缺点:
迭代器的取值不如按照索引的方式更灵活,因为他只能往后取不能往前退
无法预测迭代器值的个数(没next取一个值)
可迭代对象可一直进行迭代,迭代器只有第一次有,后面的为无。