闭包:延伸了作用域的函数,包含函数定义体中引用,但是不在定义体中定义的非全局变量。
有3个要素——
1:嵌套函数;2:内部函数引用了外部函数的局部变量;3:外部函数的返回值是内部函数的引用。
# 例子,来自《流畅的python》 def make_averager(): series=[] def averager(new_value): series.append(new_value) avg = sum(series)/len(series) return avg return averager #------------------------------------------ avg = make_averager() s1 = avg(10) print(s1) s2 = avg(11) print(s2) s3 = avg(12) print(s3)
装饰器的2个特性——
1:把被装饰的函数替换成其他函数;2:装饰器在加载模块时立即执行。
被装饰的函数的定义体和调用方式不会发生改变。
#例子1: import time def outer(func): def wrapper(): print('i am inner') print('start time is :' + str(time.time())) func() print('end time is :' + str(time.time())) # 装饰器加载时执行,所以会最先打印。 print('i am outer') return wrapper @outer def foo(): print('foo......') time.sleep(3) foo() print(foo) #foo的类型是outer的返回值