python_装饰器

装饰器(函数)

1、作用域   :由内往外找 L_E_G_B
x = 10
def f():
    t =5
    def inner():
        count = 7
        return 1

2、高阶函数
    1- 函数名可以作为参数输入
    2- 函数名可以作为返回值

def outer():
    x = 10
    def inner():    #条件一: inner就是内部函数
          print(x)  #外部环境的一个变量
    return inner

#inner() #局部变量,全局无法调用

3、闭包    
如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)
闭包 = 函数块 + 定义函数时的环境,inner就是函数块,x就是环境,当然这个环境可以有多个,不止一个简单的x。


装饰器
import time
'''
start = time.time()
time.sleep(1)
end = time.time()
print(end-start) 
print(start)
'''
def foo():
    print("foo^")
    time.sleeo(2)
   
def show_timer():
     start = time.time()
     foo()
     end = time.time()
     print("send %s"%(end-start))

show_time()


import time
#装饰器函数
def show_time(func):
def weapper():
start_time = time.time()
func()
end_time = time.time()
print("spend %s"%(end_time - start_time))
return wrapper

@show_time #foo = show_time(foo)
def foo():
print("hello foo")
time.sleep(3)

@show_time #bar = show_time(bar)
def bar():
  print("in the bar")
  time.sleep(2)
foo = show_time(foo)

foo()

下面写一个带参数的

import time

def show_time(foo):
    def func(x,y):
          start_time = time.time()
          foo(z,y)
          end_time = time.time()
          print("spend %s"%(end_time-start_time))
    return func

@show_time
def add(a,b):
    print(a+b)
  time.sleep(1) add(2,3)


#现在进行修改,将之变为可以求多个数字的加法运算
import time

def show_time(foo):
def func(*x,**y):
start_time = time.time()
foo(*x,**y)
end_time = time.time()
print("spend %s"%(end_time-start_time))
return func

@show_time
#修改为不定长参数
def add(*a,**b):
suns = 0
for i in a:
suns += i
print(suns)
time.sleep(1)
add(2,3.4,5)

#三层效果
import time
def looger1(flag1=""):
def show_time(foo):  #闭包
def func(*x,**y):
start_time = time.time()
foo(*x,**y)
end_time = time.time()
print("spend %s"%(end_time-start_time))
if flag1 == "True":
print("日志记录")
return func
return show_time

@looger1("True")
#修改为不定长参数
def add(*a,**b):
suns = 0
for i in a:
suns += i
print(suns)
time.sleep(1)
add(2,3.4,5)
 

 

posted @ 2019-07-18 00:46  MTcx  阅读(194)  评论(0编辑  收藏  举报