首页 > 其他 > 详细

装饰器和生成器

时间:2020-12-09 15:03:58      阅读:16      评论:0      收藏:0      [点我收藏+]

装饰器

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

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

# 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)

 

装饰器和生成器

原文:https://www.cnblogs.com/mu-tang/p/14107884.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!