天天看點

python文法——閉包

閉包的形成條件:1:函數嵌套2:嵌套函數使用外部函數變量3:外部函數傳回内部函數引用在函數嵌套的前提下,内部函數使用了外部函數的變量,并且外部函數傳回了内部函數,我們把這個使用外部函數變量的内部函數稱為閉包。      
# 做一個線性函數的例子y = 3x+20
# 1.0 函數内部嵌套了函數
def workClosure(a,b):

    # 初始化a,b的值
    a = a
    b = b

    def liner(number):
        # 2.0 使用的函數變量
        return a * number + b
    #  3.0 傳回内部函數引用
    return liner
# 執行個體化一個閉包,下面相當于傳回一個函數執行個體 y = 4x+5
# example = workClosure(4,5) ===>>> 由于workClosure傳回的是liner===>>> 推出example 指向 liner
# 此時的example就指向了liner的引用
example = workClosure(4,5)


# 設定x的值,描述函數的y值,
for i in range(0,100):
    print('函數值:', example(i))      
閉包還可以提高代碼的可重用性,不需要再手動定義額外的功能函數最簡單的是使用者的對話      
def say_hello(name,info):
    print(name,":",info)
# 要實作
say_hello("tom","正在工作")
# 每一次都要這麼調用那還不如放棄

# 用閉包
def config_name(name):
    # 嵌套内部函數
    def say_hello(info):

        print(name,":",info)
    return say_hello

# 這樣一次性綁定了一個使用者名字;一次傳,一直用,簡潔了代碼
tom = config_name("Tom")
print(tom("睡覺了"))
print(tom("起床了"))      
# 錯誤示範
# 定義一個外部函數
def func_out():
    num1 = 20
    # 定義一個内部函數
    def func_inner(num2):
        # 這裡本意想要修改外部num1的值,實際上是在内部函數定義了一個局部變量num1
        num1 = 10
        # 内部函數使用了外部函數的變量(num1)
        result = num1 + num2
        print("結果是:", result)

    print(num1)
    func_inner(1)
    print(num1)

    # 外部函數傳回了内部函數,這裡傳回的内部函數就是閉包
    return func_inner

# 建立閉包執行個體
f = func_out()
# 執行閉包      
# 定義一個外部函數
def func_out(num1):

    # 定義一個内部函數
    def func_inner(num2):
        # 這裡本意想要修改外部num1的值,實際上是在内部函數定義了一個局部變量num1
        nonlocal num1  # 告訴解釋器,此處使用的是 外部變量a
        # 修改外部變量num1
        num1 = 10
        # 内部函數使用了外部函數的變量(num1)
        result = num1 + num2
        print("結果是:", result)

    print(num1)
    func_inner(1)
    print(num1)

    # 外部函數傳回了内部函數,這裡傳回的内部函數就是閉包
    return func_inner

# 建立閉包執行個體
f = func_out(1)
# 執行閉包
f(2)