zoukankan      html  css  js  c++  java
  • 装饰器和生成器

    装饰器

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

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

    # 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)
  • 相关阅读:
    增加文章
    网站之注册
    C#常用的引用
    Session.Abandon和Session.Clear有何不同 (转)
    C#文件路径的写法
    UpdatePanel的用法详解
    [转]asp:ScriptManager
    Git 常用命令
    AJAX请求 $.post方法的使用
    a 标签中调用js的几种方法
  • 原文地址:https://www.cnblogs.com/mu-tang/p/14107884.html
Copyright © 2011-2022 走看看