L: local 函數內部作用域
E: enclosing 函數內部與內嵌函數之間
G: global 全局作用域
B: build_in 內置作用域
python函數的閉包,python的閉包函數,內部的函數會將外部函數的參數變成內部函數的一個屬性,以元組的形式儲存下來。
方式1:
描述:我們想要寫一個判斷學生成績的代碼,當科目滿分爲150,那麼及格線爲90分,如果科目滿分爲100,那麼及格線爲60分。
要求:實現查詢學生是否通過考試
def set_passline(passline):
def judge(score):
if score>=passline:
print('good')
else:
print('bad')
return judge
當我們第一次調用時候傳進去一個參數:
set_one =set_passline(150)
set_passline函數執行完會返回judge函數,並且把外層函數傳進來的passline作爲自己的屬性用一個不可變的元組保存(passline,)
set_one(80)
然後調用函數set_one,並傳入學生成績,就能進行判斷,set_one函數裏的passline,就是在運行的時候保存下來的。
f= set_passline(150)(80)
這種調用方式也是可以的。
方式2:
描述:有兩個函數把他們用閉包的方是合起來:
#求和
def add(*arg):
if len(arg)==0:
return 0
for val in arg:
if not isinstance(val,int):
return 0
return sum(arg)
#求平均值
def val(*arg):
if len(arg)==0:
return 0
for val in arg:
if not isinstance(val,int):
return 0
return sum(arg)/len(arg)
處理後
#求和
def add(*arg):
return sum(arg)
#求平均值
def val(*arg):
return sum(arg)/len(arg)
def dec(func):
def in_dec(*arg):
if len(arg)==0:
return 0
for val in arg:
if not isinstance(val,int):
return 0
func(*arg)
return in_dec
分析:
首先我們調用dec,並且把想要運行的函數傳遞進去
add =dec(add)
在這一步,程序完成了執行dec(add),把func=add,存了下來,並且把函數in_dec返回給了add.此時的add就是in_dec(*arg),攜帶了一個屬性:(func = add),func指向了之前的add的函數。
add(1,2,3,4,5)
這一步實際上執行的是in_dec(1,2,3,4,5)這個函數把*arg接收後,傳給了內部函數func ,並且執行了func(*arg)。也就是執行了之前的那個add函數。