zoukankan      html  css  js  c++  java
  • 迭代器

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

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

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

    可迭代对象可一直进行迭代,迭代器只有第一次有,后面的为无。
  • 相关阅读:
    The Python Standard Library
    Python 中的round函数
    Python文件类型
    Python中import的用法
    Python Symbols 各种符号
    python 一行写多个语句
    免费SSL证书(https网站)申请,便宜SSL https证书申请
    元宇宙游戏Axie龙头axs分析
    OLE DB provider "SQLNCLI10" for linked server "x.x.x.x" returned message "No transaction is active.".
    The operation could not be performed because OLE DB provider "SQLNCLI10" for linked server "xxx.xxx.xxx.xxx" was unable to begin a distributed transaction.
  • 原文地址:https://www.cnblogs.com/yf18767106368/p/9173272.html
Copyright © 2011-2022 走看看