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