装饰器和生成器

装饰器

装饰器的本质就是一个闭包函数

装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展

# def wrapper(func):
#     def inner(*args,**kwargs):
''' 在函数执行前执行的操作 ''' # ret
= func(*args,**kwargs)
''' 在函数执行后执行的操作 ''' #
return ret # return inner # # @wrapper #语法糖 # def func(): # pass # func()

多个装饰器装饰一个函数

# def wrapper1(func):
#     def inner1(*args,**kwargs):
#         print('110011')
#         ret = func(*args,**kwargs)
#         print('001100')
#         return ret
#     return inner1
#
# def wrapper2(func):
#     def inner2(*args,**kwargs):
#         print('220022')
#         ret = func(*args,**kwargs)
#         print('002200')
#         return ret
#     return inner2
#
# def wrapper3(func):
#     def inner3(*args,**kwargs):
#         print('330033')
#         ret = func(*args,**kwargs)
#         print('003300')
#         return ret
#     return inner3
#
# @wrapper3
# @wrapper2
# @wrapper1
# def f():
#     print('in f')
#
# f()

执行结果如下:

330033
220022
110011
in f
001100
002200
003300

 

一个装饰器装饰多个函数,并用变量控制

# import time
# FLAG = 1       #控制变量 FLAG 修改FLAG可让装饰器实现不同功能
# def timmer_out(flag):
#     def timmer(func):
#         def inner(*args,**kwargs):
#             if flag:
#                 start = time.time()
#                 ret = func(*args,**kwargs)
#                 end = time.time()
#                 print(end-start)
#                 return ret
#             else:
#                 ret = func(*args,**kwargs)
#                 return ret
#         return inner
#     return timmer
#
#
# @timmer_out(FLAG)
# def shop_add():
#     time.sleep(0.1)
#     print('添加一个')
# @timmer_out(FLAG)
# def shop_del():
#     time.sleep(0.2)
#     print('减少一个')
#
# shop_add()
# shop_add()
# shop_del()

 

生成器

带yield的函数就是生成器

def wahaha():
    for i in range(20):
        yield 'wahahha%s'%i

w = wahaha()
ret = w.__next__()
print(ret)

从生成器中取值方法

next方法 for循环 强制类型转换

 

send方法

# def generator():
#     print(123)
#     content = yield 1
#     print('====',content)
#     print(456)
#     yield 2
#
# g = generator()
# ret = g.__next__()
# print(ret)
# ret = g.send('hello')
# print(ret)
send方法,获取下一个值时和next效果一样
#只是在获取下一个值时,给上一yield的位置传入一个数据
    #第一次获取值时不能用send只能用next方法
    #最后一个yield不能接收外部数据
#获取动态平均值
# def init(func):
# def inner(*args,**kwargs):
# g = func(*args,**kwargs)
# g.__next__()
# return g
# return inner #装饰器执行next方法 用户更方便
#
# @init
# def average():
# sum = 0
# avg = 0
# count = 0
# while True:
# num = yield avg
# sum += num
# count += 1
# avg = sum / count
#
# ag = average()
# ret = ag.send(10)
# print(ret)
# ret = ag.send(20)
# print(ret)
# ret = ag.send(30)
# print(ret)

 

posted @ 2020-12-09 12:24  木_糖  阅读(67)  评论(0编辑  收藏  举报