Python的閉包和JavaScript中的閉包很像,形式都是一個函式的返回值為另一個函式,返回出來的這個函式引用了它外層函式的變數。例子:
def foo(a):
def bar(b):
return a + b
return bar
add_one = foo(1)
print(add_one(1)) # 2
print(add_one(2)) # 3
print(add_one(3)) # 4
複製程式碼
閉包的作用
-
讓函式內部的變數在執行完畢後不被回收
例子:
# 計數器,每呼叫一次就加一 def counter(): counts = 0 def add_one(): nonlocal counts counts += 1 return counts return add_one counter_1 = counter() print(counter_1()) # 1 print(counter_1()) # 2 print(counter_1()) # 3 print(counter_1()) # 4 複製程式碼
-
在某些情況下更為簡潔
例子:
# 做一個運算 a * x + b,x可變,a,b固定 def line(a, b): return lambda x: a * x + b line_1 = line(10, 20) line_2 = line(100, 200) print(line_1(5)) # 70 print(line_1(6)) # 80 print(line_1(7)) # 90 print(line_2(5)) # 700 print(line_2(6)) # 800 print(line_2(7)) # 900 複製程式碼
從例子中可以看出,可以給定a,b的值,然後每次修改x的時候,只傳入x就可以了。這樣是不是更簡潔,每個人的看法可能會不同。