note ='''
0.无参装饰器补充(如何伪装的一模一样?)python帮你写好了,直接用就行!
实例代码:from functools import wraps
def outter(func):
@wraps(func)
def wrapper(*args, **kwargs):
res = func(*args, **kwargs) # res=index(1,2)
return res
1.有参装饰器
1.1 什么是有参装饰器?
能够给wrapper传入除了func之外的参数
1.2 为什么要有有参装饰器?
因为在无参装饰器中,由于语法糖的缘故,外层函数只能接受一个参数func,而有时候wrapper有多个参数的需求
1.3 如何实现有参装饰器?1.3.1 完全类似于无参装饰器的第二层,再在外面套一层
语法糖变为:@最外层(第三层)函数(传入的参数1,传入的参数2,......)
执行时:先执行‘’最外层(第三层)函数(传入的参数1,传入的参数2,......)‘’,得到返回值,返回值为第二层函数的内存地址,语法糖变为:@第二层函数,之后就跟无参一样了1.4 装饰器最多三层就够了,因为第三层可以支持传入任意多的参数1.5 有参装饰器模板# 有参装饰器模板def 有参装饰器(x,y,z):
def outter(func):
def wrapper(*args, **kwargs):
res = func(*args, **kwargs)
return res
return wrapper
return outter
@有参装饰器(1,y=2,z=3)
def 被装饰对象():
pass
2.迭代器
2.1 什么是迭代器?
用来迭代取值的工具
2.2 有什么用
2.2.0 给无索引数据类型提供了一种遍历的方法
2.2.1 for循环的底层实现机制
2.2.2 后面可以自定义迭代器(生成器)
2.3 如何实现?
2.3.1
什么是可迭代对象?含有__iter__方法的对象,包括字符串,列表,字典,集合,元组,文件 g = 可迭代对象.__iter__() --》g即为迭代器
2.3.2
性质一:每对迭代器调用一次__next__(),即读取出迭代器里面的一个值
性质二:迭代器就像一只老母鸡,下蛋的个数是有限的,当读完全部值,再调用__next__(),就会报错
利用性质一,二及while循环,异常检测,即可自己实现for循环的效果(也即for循环的底层实现)
2.4 其他
可迭代对象.__iter__() 可以写为 iter(可迭代对象)
可迭代对象.__next__() 可以写为 next(可迭代对象)
3.生成器
3.1 什么是生成器?即自定义的迭代器
3.2 怎么实现生成器?
利用yield关键字,在函数中遇到return会结束函数,而遇到yield会将函数暂时挂起并返回yield的值
实例:def func():
yield 1
yield 2
yield 3
这样定义的就是一个生成器(可以理解为有yield的函数就是生成器)
直接func()是不会返回任何东西的,得用调用迭代器的方法才可以g = func()(这时候g就是一个生成器对象(也就是一个迭代器对象))print(g.__next__())即可执行yield前面的所有语句并返回yield的值,下一次再print(g.__next__())即执行上一次结束的yield到下一个yield的所有语句并返回下一个yield的值
4.今日项目
4.1日志装饰器(有参装饰器)requests = 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定
注意:时间格式的获取import time
time.strftime('%Y-%m-%d %X')
import time
def outter(file_path):
def deco(func):
def wrapper(*args,**kwargs):
with open(file_path,'a') as f:
a = '\n'+time.strftime('%Y-%m-%d %X')+f' {func}'+' run'
f.write(a)
res = func(*args,**kwargs)
return res
return wrapper
return deco
@outter('b.txt')
def f1():
print('f1执行')
f1()
4.2 生成器实现range功能requests = 自定义迭代器实现range功能def my_range(start,stop,step):
while start < stop:
yield start
start += step
g = my_range(0,10000,1000)
while True:
try:
print(g.__next__())
except StopIteration:
break
‘’‘