python cookbook——函数

一、装饰器

1.基本构造器

装饰器:

1.不改变原函数

2.把原函数作为一个参数,传给装饰器,返回一个新函数

目的:

1.在不改变原函数的情况下,对原函数添加新的功能

2.代码示例

import time

def time_cost(func):
    def time_cost_cal():
        start = time.time()
        func()
        end = time.time()
        gap = end - start
        print("it costs", gap, "time")
    return time_cost_cal

@time_cost
def func():
    print("start")
    time.sleep(1)
    print("end")

if __name__ == '__main__':
    func()

3. 带有未知参数的装饰器

#带有不定参数的装饰器
  import time
  
  def deco(func):
      def wrapper(*args, **kwargs):
          startTime = time.time()
          func(*args, **kwargs)
          endTime = time.time()
          msecs = (endTime - startTime)*1000
         print("time is %d ms" %msecs)
     return wrapper
 
 
 @deco
 def func(a,b):
     print("hello,here is a func for add :")
     time.sleep(1)
     print("result is %d" %(a+b))
 
 @deco
 def func2(a,b,c):
     print("hello,here is a func for add :")
     time.sleep(1)
     print("result is %d" %(a+b+c))
 
 
 if __name__ == '__main__':
     f = func
     func2(3,4,5)
     f(3,4)
     #func()

注意:python cook——数据结构里面提及过, *args是元组,args是列表

args = argument ,kwargs = keyword arguments关键字参数

**kwargs返回的是字典

*args返回的是数组

4.多个装饰器

import time
 
def deco01(func):
    def wrapper(*args, **kwargs):
        print("this is deco01")
        startTime = time.time()
        func(*args, **kwargs)
        endTime = time.time()
        msecs = (endTime - startTime)*1000
        print("time is %d ms" %msecs)
        print("deco01 end here")
    return wrapper

def deco02(func):
    def wrapper(*args, **kwargs):
        print("this is deco02")
        func(*args, **kwargs)

        print("deco02 end here")
    return wrapper
 
@deco01
@deco02
def func(a,b):
    print("hello,here is a func for add :")
    time.sleep(1)
    print("result is %d" %(a+b))
if __name__ == '__main__':
    func(3,4)
     #func()

 走一遍数据流:

@deco1 -> print("this is deco01") ->func(*args, **kwargs) ->print("this is deco02")

-> func(*args, **kwargs) ->执行func -> 继续执行deco02 -> 继续执行deco01

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值