python語法之函數對象/嵌套/名稱空間/做用域

1、函數對象python

一、 函數名是能夠被引用的函數

def foo():
    print('from foo')
res = foo   #把函數名foo給了res,res和foo指向了同一個內存地址
res()   #from foo

二、函數名能夠當作參數傳遞spa

def foo1(a,b):  #a=1,b=foo2
    print(a)     #1
    b()        #b() 即foo2() 去執行foo2()的函數,結果:from foo2
def foo2():
    print('from foo2')
foo1(1, foo2)   #foo2做爲參數傳給了b

三、函數名能夠當作返回值使用code

def foo(x):
    return x
def foo1():
    print('from foo1')
res = foo(foo1)   #把函數名foo1給了x,調用foo()函數返回foo1,而後把foo1給了res
res()  #res() 便是foo1()

四、函數名能夠當作容器類型的元素對象

def func():
    print('from func')
l1 = [1,'2',func]
l = l1[2]   #即l=func
l()       #func()

4.一、購物車:blog

func_dic = {
    '1': register,
    '2': login,
    '3': shopping,
    '4': pay
}

def main():
    while True:
        print("""
            一、註冊
            二、登陸
            三、購物
            四、付款
            五、退出
        """)
        choice = input("請輸入對應的編號:").strip()
        if choice == '5':
            break
        if choice not in func_dic:
            continue
        else:
            func_dic[choice]()

main()

 

2、函數的嵌套生命週期

2.一、函數的嵌套調用:在函數內調用函數ip

2.二、函數的嵌套定義:在函數內部定於函數內存

 

3、名稱空間作用域

3.一、名稱分類

3.1.一、內置名稱空間:python提早給定好的名字,好比內建函數名len,print。

3.1.二、全局名稱空間:存放於文件級別的名字,頂格的名稱。

3.1.三、局部名稱空間:函數內部定義的名字。

 

3.二、名稱空間的生命週期

3.2.一、內置名稱空間:伴隨着python解釋器的啓動而產生,關閉而回收。

3.2.二、全局名稱空間:伴隨着pytho文件的開始執行而產生,執行完畢而回收。

3.2.三、局部名稱空間:伴隨着函數的調用而產生,函數結束調用而回收。

 

3.三、名稱空間的順序

加載順序:內置名稱空間 > 全局名稱空間 > 局部名稱空間

查找順序:局部名稱空間 > 全局名稱空間 > 內置名稱空間

# 函數內部使用的名字,在定義階段就已經規定死了,與你的調用位置無關

def func1():
    x = 2
    def func2():
        x = 3
        print('func2:', x)
    func2()
    print('func1:', x)
func1()

 

4、做用域

4.一、分類

4.1.一、全局做用域

位於全局名稱空間、內置名稱空間中的名字屬於全局範圍。該範圍內的名字全局存活、全局有效(在任意位置均可以使用)。

4.1.二、局部做用域

位於局部名稱空間的名字屬於局部範圍。該範圍內的名字臨時存活(即在函數調用時臨時生成,函數調用結束後就釋放)、局部有效(只能在函數內使用)。

 

4.二、做用域與名字查找優先級

4.2.一、在局部做用域查找名字時,起始位置是局部做用域,因此先查找局部名稱空間,沒有找到,再去全局做用域查找:先查找全局名稱空間,沒有找到再查找內置名稱空間,最後沒找到拋出異常。

x = 1
def foo2():
    x = 2
    def foo3():
        x = 3
        print(x)  #x=1
    foo3()
foo2()

 

4.2.二、在全局做用域查找名字時,起始位置時全局做用域,因此先查找全局名稱空間,沒有找到再查找內置名稱空間,最後沒找到拋出異常。

x = 1
def foo2():
    x = 2
foo2()
print(x)  #1  

#4.2.三、python支持函數的嵌套定義,在內嵌的函數查找名字時,會優先查找本身局部做用域的名字,而後由內而外一層層查找外部嵌套函數定義的做用域,都沒有找到,則查找全局做用域。

x = 1 def foo(): x = 2 def foo1(): x = 3 def foo2(): # x = 4 def foo3(): x = 5 print('foo3:',x) #5 foo3() print('foo2:',x) #4 foo2() print('foo1:',x) #3 foo1() print(x) #2 foo()
#在函數內,不管嵌套多少層,均可以查看到全局做用域的名字,若要在函數內修改全局名稱空間的名字值,須要用到global關鍵字

x = 1 def foo2(): global x x = 2 foo2() print(x) #2
#nonlocal

x = 1
def foo2():
    x = 2
    def foo3():
        nonlocal x
        x = 3
        print(x)  x=3 
    foo3()
foo2()
相關文章
相關標籤/搜索