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)
  • 相关阅读:
    Python入门11 —— 基本数据类型的操作
    Win10安装7 —— 系统的优化
    Win10安装6 —— 系统的激活
    Win10安装5 —— 系统安装步骤
    Win10安装4 —— 通过BIOS进入PE
    Win10安装2 —— 版本的选择与下载
    Win10安装1 —— 引言与目录
    Win10安装3 —— U盘启动工具安装
    虚拟机 —— VMware Workstation15安装教程
    Python入门10 —— for循环
  • 原文地址:https://www.cnblogs.com/mu-tang/p/14107884.html
Copyright © 2011-2022 走看看