1. 程式人生 > >函數對象、函數嵌套、名稱空間與作用域

函數對象、函數嵌套、名稱空間與作用域

pan oca 函數 三種 locals ice 無法 利用 多分支

一、 函數是第一類對象,即函數可以當作數據傳遞

#1 可以被引用
#2 可以當作參數傳遞
#3 返回值可以是函數
#3 可以當作容器類型的元素

二、 利用該特性,優雅的取代多分支的if

def foo():
    print(‘foo‘)

def bar():
    print(‘bar‘)

dic={
    ‘foo‘:foo,
    ‘bar‘:bar,
}
while True:
    choice=input(‘>>: ‘).strip()
    if choice in dic:
        dic[choice]()

 三、 函數的嵌套調用

 

def max(x,y):
    return x if x > y else y

def max4(a,b,c,d):
    res1=max(a,b)
    res2=max(res1,c)
    res3=max(res2,d)
    return res3
print(max4(1,2,3,4))

 四、 函數的嵌套定義

def f1():
    def f2():
        def f3():
            print(‘from f3‘)
        f3()
    f2()

f1()
f3() #報錯,為何?請看下一小節

五、 名稱空間與作用域

(1) 什麽是名稱空間?

#名稱空間:存放名字的地方,三種名稱空間,(之前遺留的問題x=1,1存放於內存中,那名字x存放在哪裏呢?名稱空間正是存放名字x與1綁定關系的地方)

(2)名稱空間的加載順序 

#1、python解釋器先啟動,因而首先加載的是:內置名稱空間
#2、執行test.py文件,然後以文件為基礎,加載全局名稱空間
#3、在執行文件的過程中如果調用函數,則臨時產生局部名稱空間

(3)名字的查找順序

局部名稱空間--->全局名稱空間--->內置名稱空間

#需要註意的是:在全局無法查看局部的,在局部可以查看全局的,如下示例

# max=1
def f1():
    # max=2
    def f2():
        # max=3
        print(max)
    f2()
f1()
print(max) 

(4)作用域

#1、作用域即範圍
        - 全局範圍(內置名稱空間與全局名稱空間屬於該範圍):全局存活,全局有效
      - 局部範圍(局部名稱空間屬於該範圍):臨時存活,局部有效
#2、作用域關系是在函數定義階段就已經固定的,與函數的調用位置無關,如下
x=1
def f1():
    def f2():
        print(x)
    return f2
x=100
def f3(func):
    x=2
    func()
x=10000
f3(f1())

#3、查看作用域:globals(),locals()


LEGB 代表名字查找順序: locals -> enclosing function -> globals -> __builtins__
locals 是函數內的名字空間,包括局部變量和形參
enclosing 外部嵌套函數的名字空間(閉包中常見)
globals 全局變量,函數定義所在模塊的名字空間
builtins 內置模塊的名字空間

  

函數對象、函數嵌套、名稱空間與作用域