python开发学习day16 (三层装饰器;迭代器)
2020-06-22 目录:
一、嵌套三层的装饰器
二、迭代器
2.1 迭代器是什么
2.2 __iter__方法及其调用
2.3 可迭代的对象
2.4 迭代器对象
2.5 for循环的原理
2,6 总结迭代器
一、嵌套三层的装饰器
通过闭包的方式为函数体传参,可以包一层,也可以包两层
@后面跟的必须是一个函数的内存地址,@函数名(参数)的形式也是可以的,前提是 “@函数名(参数)”的返回值必须是一个函数的内存地址
示例:
def outter2(mode): # mode在outter和wrapper后面传参都不行,只能再包一层函数传参 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="mysql") # index = outter(index) ==> index = wrapper def index(x, y): print('index===>', x, y) index(1, 2) # wrapper(1,2)
二、迭代器
2.1 迭代器是什么
迭代是一个重复的过程,但并不是单纯的重复,它的每一次重复都是基于上一次的结果而来的
迭代器是一种迭代取值的工具,这种取值方式是通用的,不依赖于索引和key(如:集合和句柄,没有索引和key也可以迭代取值)
2.2 __iter__方法及其调用
python为str、list、tuple、dict、set、f文件对象 都内置了__iter__方法 __iter__调用得到的返回值就是对应的迭代器 l1 = [1,2,3] res = l1.__iter__() 就等同于 res = iter(l1) print(res) # >>> <list_iterator object at 0x000001942A9C4A30> a = res.__next__() # a=next(res) a=1 b = res.__next__() # b=next(res) b=2 c = res.__next__() # c=next(res) c=3 d = res.__next__() # StopIteration 报错,l1只有三个值
2.3 可迭代的对象
可迭代的对象:有__iter__内置方法的对象都是可迭代的对象,str、list、tuple、dict、set、文件对象
2.4 迭代器对象
可迭代对象.__iter__()得到的返回值就是迭代器对象 特点: ① 有__next__方法 ② 有__iter__方法,调用得到的就是迭代器自身
f = open(r'user.db', mode='rt', encoding='utf-8')
line=f.__next__() # 读第一行
print(line)
line=f.__next__() # 读第二行
print(line)
f.close()
2.5 for循环的原理
for循环的本质就是迭代器的循环 d = {"k1": 111, "k2": 222, "k3": 3333} for k in d: print(k) 工作步骤:① 调用in后面对象的__iter__方法,得到对应的迭代器 ② k=next(迭代器),然后执行一次循环 ③ 循环往复,直到把迭代器的值取完,抛出异常,for循环会将自动捕捉异常,然后结束循环
2.6 总结迭代器
优点:① 不依赖索引,是通用的取值方式
② 节省内存,读取文件时,每次只读一行
缺点:① 不能取指定位置的值(没有索引和key)
② 不能预估值的个数,无法统计长度