装饰器
装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
先定义一个基本的装饰器:
def orter(func): #定义装饰器 def inner(): print("之前") s = func() #调用原传入参数函数执行 print("之后") return s #return原函数返回值 return inner #将inner函数return给name函数 @orter #调用装饰器(将函数name当参数传入orter装饰器) def name(): print("原本") return True #name原函数return True #当定义一个接受值时,有返回值 ret = name() print(ret) #输出结果 之前 原本 之后 True #当直接执行时函数name函数,没有return值 def orter(func): #定义装饰器 def inner(): print("之前") s = func() #调用原传入参数函数执行 print("之后") return inner #将inner函数return给name函数 @orter #调用装饰器(将函数name当参数传入orter装饰器) def name(): print("原本") name() #输出结果 之前 原本 之后
给装饰器传参数:
def orter(func): def inner(a,b): #接收传入的2个参数 print("之前") s = func(a,b) #接收传入的原函数2个参数 print("之后") return s return inner @orter def name(a,b): #接收传入的2个参数,并name整体函数当参数传入orter装饰器 print("This is name.%s,%s"%(a,b)) return True ret = name(‘yu‘,‘mei‘) #传入2个参数 print(ret) 输出结果: 之前 This is name.yu,mei 之后 True
给装饰器传万能参数:
def orter(func): def inner(*args,**kwargs): #万能参数接收多个参数 print("之前") s = func(*args,**kwargs) #万能参数接收多个参数 print("之后") return s return inner @orter def name(a,b,c): #接受传入的多个参数 print("This is name.%s,%s%s"%(a,b,c)) return True ret = name(‘yu‘,‘mie‘,‘car‘) print(ret)
输出结果: 之前 This is name.yu,mei,car 之后 True
一个函数应用多个装饰器方法:
def orter(func): def inner(*args,**kwargs): #万能参数接收多个参数 print("第一之前") s = func(*args,**kwargs) #万能参数接收多个参数 print("第一之后") return s return inner def orter_2(func): def inner(*args,**kwargs): #万能参数接收多个参数 print("第二之前") s = func(*args,**kwargs) #万能参数接收多个参数 print("第二之后") return s return inner @orter @orter_2 def name(a,b,c,k1=‘‘): #接受传入的多个参数 print("This is name.%s,%s,%s,%s"%(a,b,c,k1)) return True ret = name(‘yu‘,‘mie‘,‘car‘) print(ret) #输出结果 第一之前 第二之前 This is name.yu,mie,car, 第二之后 第一之后 True
迭代器
1、迭代器 __next__
迭代器只不过是一个实现迭代器协议的容器对象。
特点:
- 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
- 不能随机访问集合中的某个值 ,只能从头到尾依次访问
- 访问到一半时不能往回退
- 便于循环比较大的数据集合,节省内存
a = iter([1,2,3,4,5,6,7]) for i in range(7): print(a.__next__()) #输入结果 1 2 3 4 5 6 7StopIteration
#末尾生成StopIteration异常
2、生成器
一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator);如果函数中包含yield语法,那这个函数就会变成生成器。
def test(): print("1111") yield 1 print("222") yield 2 print("333") yield 3 ret = test() # print(ret) #<generator object xran at 0x00000000006ED308> result = ret.__next__() print(result) result = ret.__next__() print(result) result = ret.__next__() print(result) #返回结果 1111 1 222 2 333 3