In programming languages, a closure, also lexical closure or function closure, is a technique for implementing lexically scoped name binding in a language with first-class functions. Operationally, a closure is a record storing a function together with an environment. The environment is a mapping associating each free variable of the function (variables that are used locally, but defined in an enclosing scope) with the value or reference to which the name was bound when the closure was created.
直接展示例子
PYTHON
1
2
3
4
5
6
7
8
9
10
def f():
x=1
def g(y):
return x + y
# 返回闭包
return g
closure = f()
# 输出3
print(closure(2))
本来在 f() 执行完后,x 就会被内存回收,但是内部函数使用了 x,因此 x 内存不会被回收。 闭包的好处在于函数内的参数不会被内存回收,可以隐藏一些内容,同时避免了命名冲突。缺点在于内存无法自动回收,容易溢出。
装饰器 (decorator)
先来看看一个简单的装饰器例子
PYTHON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import time
# 外部
def timer(func):
#内部
def wapper(*args,**kwargs):
start = time.time()
ans = func(*args,**kwargs)
end = time.time()
print(end - start)
return ans
return wapper
@timer
def loop(nums):
for i in range(nums):
pass
print("over")
loop(55555555)
print(loop.__name__)