python函數作用域與閉包

這裏寫圖片描述

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函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章