1. 程式人生 > 實用技巧 >函式物件、名稱空間和作用域

函式物件、名稱空間和作用域

一、函式物件

函式的名字就是函式物件,它在python中是第一類物件,函式名指向的是函式的記憶體地址。

1.1 函式物件的作用:

1、函式名可以被引用

def bar():
    print('from bar')
f=bar
f()

2、函式名可以當作引數傳入

def bar():
    print('from bar)
def wrapper(func):  #func=bar
    func()
wrapper(bar)

3、可以當函式的返回值

def bar():
    print('from bar')
def foo(func):
    return func
#print(bar) f = foo(bar) # f ---> bar #print(f) f()

4、函式名可以作為容器型別的元素

def get():
    print('from get')
def put():
    print('from put')
l = [get,put]
#print(l)
l[0]()

1.2 函式物件的應用

可以優雅地取代if分支

二、函式巢狀

作用:讓內層函式封閉起來,不讓外部直接呼叫

2.1 函式的巢狀呼叫:

在函式內又呼叫其他函式,將複雜並且小的功能,在函式內部呼叫,解決程式碼結構清晰問題

def max1(x,y):
    
if x > y: return x else: return y def max2(x,y,z): res1 = max1(x,y) res2 = max1(res1,z) return res2 print(max2(11,199,2))

2.2 函式的巢狀定義:

例1:
def func1():
    print('from func1')
    def func2():
        print('from func2')
    func2()
func1()

三、名稱空間

名稱空間:存放名字與值繫結關係的地方,如果你想訪問一個變數值,必須要先訪問對應的名稱空間

名稱空間的分類:

內建名稱空間:存放python直譯器自帶的名字。
在啟動python直譯器時就生效,關閉就失效

全域性名稱空間:檔案級別(頂頭寫的名字)的名字。
在執行檔案時生效,在檔案結束或者在檔案執行期間被刪除的就失效

def func():  #func是全域性的
    pass

if 10>3:    
    y =333   #y 是全域性的

區域性名稱空間:存放函式內定義的名字(函式的引數以及函式內的名字都存放於區域性記憶體空間)。
在呼叫當前函式時臨時生效,函式體程式碼執行結束時失效。

載入順序:內建名稱空間 -->>全域性名稱空間-->>區域性名稱空間
名稱空間的查詢順序:區域性名稱空間-->>全域性名稱空間-->>內建名稱空間

len = 'global'
def f1():
    # len = 1
    def f2():
        # len = 2
        print(len)
    len = 1
    f2()
f1()

四、作用域

作用域:名稱空間發揮作用的範圍

作用域的分類:

1、全域性作用域:包含的是內建名稱空間與全域性名稱空間的名字
特點: 只要程式一直執行,永久存活,若程式結束,則銷燬

2、區域性作用域:包含的是區域性名稱空間的名字
特點:只能在函式內使用,呼叫函式時生效,呼叫結束失效

補充:
1、global:宣告全域性變數

def index():
    global x  #宣告X是全域性變數
    x=2
    print(x)
index()
print(x)

2、nonlocal:在區域性名稱空間宣告區域性變數,在區域性修改外部(上層函式)的變數

def index():
    x=1
    def func():
        nonlocal x
        x=2

    func()
    print(x)
index()