1.闭包
简单理解:闭包就是多层函数的嵌套,外层函数的返回值是内层函数的引用。
def out_func(n):
num = 100
def in_fucn(*args,**kwargs): # nonlocal num
if n % 2 == 0: # 里面没有修改num的值,直接使用可以,如果变成 num += n 则会报错,因此需要使用前加上nonlocal num
return n + num # return num += n
else:
return n- num
return in_fucn
test = out_func(10)
ret = test()
print(ret)
# 结果
110
闭包的作用就是,装饰器。
2.装饰器
简单的理解:就是不改变函数结构的情况下,给函数增加功能。
def outter(func):
def inner(*args,**kwargs):
print("今天星期五")
func(*args,**kwargs)
print("下午我和,小红去吃烤鱼")
return inner
def test(*args,**kwargs):
print("今天天气很不错")
test = outter(test) # 标准写法
test() # 普通的调用了test函数,但是给函数上下都多打印了一行数字。
# 结果
今天星期五
今天天气很不错
下午我和,小红去吃烤鱼
装饰器实现检测函数运行时间的功能
import time
def outter(func):
def inner(*args,**kwargs):
start_t = time.time()
func(*args,**kwargs)
end_t = time.time()
print("函数test的运行时间为{}s".format(end_t-start_t))
return inner
def test(*args,**kwargs):
time.sleep(10)
test = outter(test)
test()
# 结果
函数test的运行时间为10.098577499389648s
优雅的写法
import time
def outter(func):
def inner(*args,**kwargs):
start_t = time.time()
func(*args,**kwargs)
end_t = time.time()
print("函数test的运行时间为{}s".format(end_t-start_t))
return inner
@outter
def test(*args,**kwargs):
time.sleep(10)
test()
# 结果
函数test的运行时间为10.000571966171265s