装饰器:为已存在的函数或者或者对象添加额外的功能
1 def wrapper(f): #装饰器函数,f是被装饰的函数 2 def inner(*args,**kwargs): 3 '''在被装饰函数之前要做的事''' 4 print("AAAA") 5 ret = f(*args,**kwargs) #被装饰的函数 6 '''在被装饰函数之后要做的事''' 7 print("BBBB") 8 return ret 9 return inner 10 11 @wrapper #语法糖 @装饰器函数名 12 def func(a,b): #被装饰的函数 13 time.sleep(0.01) 14 print('大家好',a,b) 15 return '新年好' 16 17 func(2,5)
打印结果如下
迭代器:在python中如果一个对象有_iter_()和_next_()方法,则称该对象是迭代器(Iterator),其中_iter_()方法可以让对象使用for...in循环遍历,_next_()方法糖对象可以通过next(实例名)访问下一个元素
可迭代:在python中一个一个对象有_iter_()方法或_getitem_()方法,称该对象为可迭代的(Iterable),_iter_()让对象使用for循环,_getitem_()方法是让对象可以通过“实例名[index]”的方式访问实例中的元素
# 迭代器 l = [1, 2, 3] # for i in l: # i: print(dir([])) # 列表拥有的方法 """ ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] """ # 双下划线的是双下方法 print([1].__add__([2])) # -->[1, 2] print([1] + [2]) # -->[1, 2] ret = set(dir([])) & set(dir({})) & set(dir('')) & set(dir(range(10))) print(ret) # iterable __iter__ # 判断 print('__iter__' in dir([].__iter__())) # True print('__next__' in dir([].__iter__())) # True from collections import Iterable # Iterable:可迭代对象 from collections import Iterator # Iterator迭代器 print(isinstance([], Iterator)) # False 列表不是一个迭代器 print(isinstance([], Iterable)) # True 列表是可迭代的 a = [1, 2, 3, 4] for b in a.__iter__(): print(b) # 打印结果1,2,3,4
生成器:生成器函数generator与定义普通函数一样,唯一不同的是生成器函数有一个或者多个yield,yield与return类似都是用来返回数据,两者的区别是return返回数据后直接退出当前函数,yidel是将数据返回后继续运行函数
def generator(): print(1) return 'a' ret = generator() print(ret) # 结果:1 a # 生成器函数(含有yield关键字) def generator1(): print(1) yield 'a' ret = generator1() print(ret) # 结果: <generator object generator1 at 0x0000016AFEFDCF68> ret.__next__() # 结果:1 ret.__iter__()
生成器进阶:
1 # 计算移动平均值(1) 2 def averager(): 3 total = 0.0 4 count = 0 5 average = None 6 while True: 7 term = yield average 8 total += term 9 count += 1 10 average = total / count 11 12 13 g_avg = averager() 14 next(g_avg) 15 print(g_avg.send(10)) 16 print(g_avg.send(30)) 17 print(g_avg.send(5)) 18 # 结果:10.0,20.0,15.0 19 20 # 计算移动平均值(2)_预激协程的装饰器 21 def init(func): # 在调用被装饰生成器函数的时候首先用next激活生成器 22 def inner(*args, **kwargs): 23 g = func(*args, **kwargs) 24 next(g) 25 return g 26 27 return inner 28 29 30 @init 31 def averager(): 32 total = 0.0 33 count = 0 34 average = None 35 while True: 36 term = yield average 37 total += term 38 count += 1 39 average = total / count 40 41 42 g_avg = averager() 43 # next(g_avg) 在装饰器中执行了next方法 44 print(g_avg.send(10)) 45 print(g_avg.send(30)) 46 print(g_avg.send(5)) 47 # 打印结果10.0,20.0,15.0