閉包的形成條件: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)