1. 程式人生 > >閉包和裝飾器(一)

閉包和裝飾器(一)

什麼是閉包?

我們看下閉包的結構:

外部函式:外部函式返回內部函式的引用

內部函式:內部函式使用了外部函式的引用或者變數

將這種結構的整體稱為閉包

1、定義閉包

def fun(num):
    def inner():
        print("內部函式使用了外部函式的變數 % d" %num)
    return inner
ret = fun(50)
ret()

2、通過閉包計算斜線中的點

def create_line(k ,b):
    def line(x):
        print(k*x + b)
    return line

# 建立一條斜線:斜率為1,截距為2
line_1_2 = create_line(1, 2)
# line_1_2(1)中的1相當於給line傳參
line_1_2(1)

3、在閉包中修改外部函式的變數

在閉包中修改外部函式的變數就需要涉及到另外兩個知識點:

3.1 global 

什麼時候使用global引數?

gcount=0
def gcount_test():
    # 因為在函式中修改了全域性變數gcount,但是又沒有使用global,所以會報錯
    # 如果不修改gcount的值,那麼仍然可以在函式中列印gcount引數
     global gcount 
     gcount+=1
     print(gcount)
gcount_test()

3.2 nonlocal

# nonlocal關鍵字用來在函式或其他作用域中使用外層(非全域性)變數
def fun(num):
    start=num
    def inner():
        nonlocal=start
        start=100

        print("列印輸出外部函式的引數%d"%num)
        print("列印輸出外部函式的變數%d"%start)
    return inner

ret=fun(200)
ret()