装饰器 迭代器
1.装饰器
1.1什么是装饰器
装饰器就是装饰别人的工具,具体是指为被装饰者添加新功能,为一个新函数添加新功能
1.2为何要用装饰器 (开放封闭原则)
为了不修改被装饰者的源代码以及调用方式的前提下,为被装饰着添加新功能
1.3如何实现装饰器
通过这个模板来实现具体看实际情景添加一些代码
def outter(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
2.装饰器语法糖
就是在被装饰函数头放一个@outter装饰者函数名字 等同于把outter返回值为wrapper内存地址 wrapper内存地址给index从新赋值
def outter(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
@outter 等同于 index=outter(index) wrapper内存地址赋值给index **这就是语法糖**
def index (x,y):
print('我是index',x,y)
return 123
print(index(1,2))
3.装饰器模板
def outter(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
def index (x,y):
print('我是index',x,y)
return 123
print(index)
print(index(1,2))
-------------------------------------------------------------------------------
这个装的更像 上面的help方法获取的还是wrapper 内存地址还是wrapper 这个全部都是index 了解知识
from functools import wraps
def outter(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
stop = time.time()
print(stop - start)
return res
return wrapper
@outter
def index(x, y, z):
"""index函数的文档注释"""
print('welcome to index page', x, y)
time.sleep(3)
return 123
res = index(111, 222, 333)
print(res)
print(index)
help(index)
4.迭代器
1 什么是迭代器
迭代器指的是迭代取值的工具
什么是迭代???
迭代是一个重复的过程,但是每一次重复都是基于上一次结果而继续的
比如 一个项目 第一个人做了一半 第二个人接着第一个人继续做,
2 为何要用迭代器
2.1 为了找到一种统一迭代取值方案(适用于str、list、tuple、dict、set,文件对象)
2.2 节省内存
3 如何用迭代器
可迭代的对象iterable:
内置有__iter__方法的对象(str、list、tuple、dict、set,文件对象) 除了int float 都可以迭代
有__iter__方法的就是可迭代对象
有_next__方法的就是迭代器对象
迭代器对象一定是 可迭代的
可迭代对象不一定是迭代对象
迭代器对象iterator:
内置有__iter__方法
内置有__next__方法
4.总结for循环好用 for循环就是迭代器
例子
dic = {'k1': 1111, 'k2': 2222, 'k3': 3333,'k4':4444,'k5':5555}
iter_dic = iter(dic)
iter_dic.__next__()
print(iter_dic.__iter__().__iter__().__iter__() is iter_dic) 已经是迭代器对象,在调iter也没用还是之前的对象
while True:
try:
print(next(iter_dic))
except StopIteration:
break
for x in dic:
print(x)
---------------------------------------------------------------------------------------------------------------
dic = {'k1': 1111, 'k2': 2222, 'k3': 3333,'k4':4444,'k5':5555}
iter_dic = iter(dic)
for k in iter_dic:
print(k)
print('='*50)
for k in iter_dic:
print(k)
--------------------------------------------------------------------------------------------------------------
with open('a.txt',mode='rt',encoding='utf-8') as f:
for line in f:
print(line)
print('='*50)
for line in f:
print(line)
5.自定义迭代器 生成器对象
def func():
print('hello1')
print('hello1')
print('hello1')
yield 111
print('hello2')
print('hello2')
print('hello2')
yield 222
print('hello3')
print('hello3')
print('hello3')
print('hello3')
yield 333
print('hello4')
print('hello4')
print('hello4')
print('hello4')
函数内但凡出现yield语法,我们再调用函数就不会立即触发函数体代码运行,会返回一个生成器对象,生成器对象就是一种自定义的迭代器
res=func()
print(next(res))