2020 python学习第十六天————三层装饰器与迭代器

1.2 三层装饰器

def outter2(mode):
    def outter(func):
        def wrapper(*args, **kwargs):
            inp_name=input("please input your name: ").strip()
            inp_pwd=input("please input your password: ").strip()
            if mode == "file":
                print('认证来源=====>file')
                with open('user.db', mode='rt', encoding='utf-8') as f:
                    for line in f:
                        name_db,pwd_db=line.strip('\n').split(':')
                        if inp_name == name_db and inp_pwd == pwd_db:
                            print('login successful')
                            res = func(*args, **kwargs)
                            return res
                    else:
                        print("账号或密码错误")
            elif mode == "ldap":
                print('认证来源=====>ldap')
            elif mode == "mysql":
                print('认证来源=====>mysql')
            else:
                print("未知的认证来源")
        return wrapper
    return outter

@outter2(mode="file") # index=outter(index) ==>index=wrapper
def index(x, y):
    print('index===>', x, y)


index(1, 2) # wrapper(1,2)

 

2.1 迭代器

  迭代是一个重复的过程,每一次重复都是基于上一次的结果而来的

    注意:迭代不是单纯的重复

  迭代器是一种迭代取值的工具,这种取值方式是通用,不依赖于索引

  调用__iter__方法得到的返回值就是对应的迭代器

2.2 可迭代的对象

  有__iter__内置方法的对象都是可迭代的对象,str、list、tuple、dict、set、文件对象

    ps:可迭代对象.__iter__()返回的是迭代器对象

2.3 迭代器对象

  1、有__next__方法

  2、有__iter__方法,调用迭代器的__iter__方法得到的就是迭代器自己

    ps:迭代器对象之所内置__iter__方法是为了符合for循环第一个工作步骤

2.4 for循环的工作步骤

  for循环的工作原理=》迭代器循环

d = {"k1": 111, "k2": 222, "k3": 3333}

for k in d:
    print(k)

 

    1、调用in后的对象的__iter__方法,得到对应的迭代器

    2、k=next(迭代器),然后执行一次循环

    3、循环往复,直到把迭代器的值取干净了,抛出异常,for循环会自动捕捉异常,结束循环

2.5 总结迭代器

  2.5.1 优点

    1、不依赖索引,是一种通用的取值方式

    2、节省内存

  2.5.2 缺点

    1、不能取指定位置的值

    2、不能预估值的个数,无法统计长度

你可能感兴趣的:(2020 python学习第十六天————三层装饰器与迭代器)