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)