• 迭代器


      有参装饰器,在针对账号的不同来源,还需定制不同的认证方式:

    在基于不同方式认证可以在原先的两层函数上套用第三层函数,原因在于:

    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取一个值)

    可迭代对象可一直进行迭代,迭代器只有第一次有,后面的为无。
  • 相关阅读:
    Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 1)D. Frequency of String
    edu30F. Forbidden Indices
    QQ登录模拟GUI综合
    Thread与Runnable线程继承与实现
    windowsProgram系统强制隐藏解除代码
    最长公共上升子序列(LCIS问题)
    分层图学习笔记 & [JLOI2011]飞行路线题解
    Luogu P1441 砝码称重
    NOIP 2020 复习计划
    浅析BST二叉搜索树
  • 原文地址:https://www.cnblogs.com/yf18767106368/p/9173272.html
Copyright © 2020-2023  润新知