Python學習筆記 - 閉包

MADAO是不會開花的發表於2019-01-08

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就可以了。這樣是不是更簡潔,每個人的看法可能會不同。

相關文章