Python装饰器(函数)学习笔记
Python装饰器(函数)学习笔记
要学习好装饰器必须掌握好三个知识点:
=========================================
1、函数作用域:L_E_G_B顺序查找变量。
x = 10
def f():
t = 5
def inner():
count = 7
return 1
2、高阶函数。
a 函数名可以作为参数输入
b 函数名可以作为返回值输出
3、闭包。
def outer():
x = 10
def inner():#条件1:内部函数
print(x)#条件2:外部环境的一个变量
return inner #结论:内部函数inner就是一个闭包。
f = outer()
f()
闭包:如果在一个内部函数里,在对外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。
如上例,inner就是内部函数,inner引用了外部作用域的变量x(x在外部作用域outer里,但不是全局作用域),则这个内部函数inner就是一个闭包。
关于闭包:闭包=内部函数快+定义函数时的环境
==============================
装饰器
import time
def foo():
print("foo......")
time.sleep(2)
def bar():
print("bar......")
time.sleep(3)
def show_time(f):
start = time.time()
f()
end = time.time()
print('spend %s' % (end - start))
show_time(foo)
show_time(bar)
#这种方式修改了foo()函数的调用方式,no!no!
#再来修改吧!
import time
def show_time(f):#装饰器函数,主要目的是为函数添加新功能。
def inner():#闭包函数
start = time.time()
f()
end = time.time()
print('spend %s' % (end - start))
return inner
foo = show_time(foo)
bar = show_time(bar)
foo() #没有改变原来的调用方式
bar() #没有改变原来的调用方式
#===========================================================
# 现在看看python对装饰器的高大上包装
import time
def show_time(f):#装饰器函数,主要目的是为函数添加新功能。
def inner():#闭包函数
start = time.time()
f()
end = time.time()
print('spend %s' % (end - start))
return inner
@show_time # foo = show_time(foo)
def foo():
print("foo......")
time.sleep(2)
@show_time # bar = show_time(bar)
def bar():
print("bar......")
time.sleep(3)
foo()
bar()
# =============================================================

浙公网安备 33010602011771号