1. 程式人生 > 實用技巧 >廣義字尾自動機(廣義 SAM)【模板】

廣義字尾自動機(廣義 SAM)【模板】

閉包

因為python中函式也可以當作物件,所以如果出現當我們返回一個函式,而該函式含有外部變數的時候就形成了閉包。
閉包的特點:

  1. 是個巢狀函式
  2. 可以獲得非區域性的變數
  3. 將函式當作物件返回

看一個例子會更易理解:

def make_printer(msg):

    msg = "hi there"

    def printer():
        print(msg)

    return printer

myprinter = make_printer("Hello there")
myprinter()
hi there

可以看出,myprinter返回的是函式物件(閉包特點3,1),而myprinter()則獲取了printer()域之外的變數值(閉包特點2)

閉包和nonlocal

下面兩個例子則是獲得了域之外的,關鍵字nonlocal的使用獲得累加的效果。

def make_counter():

    count = 0
    def inner():
        nonlocal count  # 去掉報錯,count是不可變型別
        count += 1
        return count

    return inner

counter = make_counter()
c = counter()
print(c)
c = counter()
print(c)
1
2

上文使用nonlocal 是因為int型別是不可變型別,若不使用nonlocal則,無法對inner()中的count 進行更改值
而對可變型別,則例子如下:

def make_summer():
    data = []
    def summer(val):
        data.append(val)
        _sum = sum(data)
        return _sum
    return summer

summer = make_summer()

s = summer(1)
print(s)
s = summer(2)
print(s)
1
3