1. 程式人生 > >函數對象,名稱空間,作用域,閉包函數

函數對象,名稱空間,作用域,閉包函數

space 一個 ret 調用 內置 包含 函數對象 拆分 沒有

"""
函數嵌套:
嵌套是一個物體裏套著另一個物體,函數嵌套就是一個函數中還有另一個函數
嵌套調用
指的是,在函數的執行過程中調用了另一個函數
其好處是,可以簡化外層大函數的代碼,使得結構更清晰,
可以將一個大的復雜的功能拆分為多個簡單的小功能

嵌套定義
指的是,在函數的函數體中定義了另一個函數
需要註意的是:內部定義的函數,只能在內部使用,外界無法直接訪問
唯一的使用場景就是閉包函數,除此之外不要這麽寫

名稱空間
名稱空間就是存放名稱的內存空間,namespace
名稱空間的分類
內置名稱空間:存的是解釋器內置的名稱空間,例如len,print等,在解釋器啟動的時候,就啟動了。
特點:在解釋器啟動就一直有效。
生命周期:解釋器啟動就有效,解釋器關閉無效。
全局名稱空間:存的是文件裏頂端的名稱,頂端就是沒有縮進的名稱,例如定義x=10之類的,
要註意的是,如果if,while,with前面沒有縮進的話,那麽它們裏的也是全局名稱。
特點:在文件運行時一直有效
生命周期:文件程序運行時開始生效,結束時無效。
局部名稱空間:存放的是函數內定義的名稱。
特點:僅在調用函數時生效
生命周期:調用函數時生效,調用結束後失效。
名稱空間的加載順序:內置-->全局-->局部
名字的查找順序:局部-->全局-->內置/全局-->內置

作用域
域是範圍,區域,作用域就是作用的範圍,區域。就是名字的有效範圍.
作用域分為兩種:
全局作用域:
在內置名稱空間與全局名稱空間內的名字,能被所有位置訪問,根據訪問位置就稱之為全局作用域。
全局作用域包含內置名稱空間與全局名稱空間
局部作用域:
局部名稱空間的名字只能在當前的函數中訪問,所以它單獨劃到一個範圍中,
這個範圍稱之為局部作用範圍即局部作用域

global(全局) 與 nonlocal(不使用本地) 關鍵字
global是將局部作用域的名字定義更改到全局中
nonlocal是將當前層函數的名字定義到上一層函數體中去,不能定義到全局。

函數對象
沒有新技術點
目的是為了讓你知道 函數都可以怎麽來使用

函數是第一類對象:
1.可以被調用
2.可以當成容器類的元素使用
3.可以當函數的參數
4.可以當函數的返回值
函數名除了可以調用之外與一個變量名,沒有本質區別,變量能怎麽用函數名就能怎麽用

閉包函數:
閉包函數就是將一個函數關閉,包裝起來。一個函數被另一個函數包裹
閉包函數也是一種函數。
特點:
1.該函數是定義在另一個函數的中的
2.該函數包含了對外層函數中名字的引用,無論在任何位置使用這個函數,其都包含了外部名字引用
滿足以上兩條 就稱之為閉包函數

需要註意的是:名字所在的作用域 在函數定義階段就已經固定了,與調用位置無關

現階段 可以將閉包理解為 另一種為函數體傳值的方式
之前只能通過參數給函數傳值
現在可以通過閉包的方式

"""

#函數嵌套的代碼使用:
def f1():
def f2():
pass
f1()
f2()#會報錯,不能直接訪問到嵌套的函數,需要通過返回值來訪問

#名稱空間
print(len)#內置名稱空間
x=10#全局名稱空間
def f1():
x=10#局部名稱空間


#作用域 global(全局) 與 nonlocal(不使用本地) 關鍵字
a=100
def func():
global a
a=10
func()
print(a) # a=10

a=100
def func():
a=500
def func1():
nonlocal a
a=250
func1()
print(a) #a=250
func()
print(a) #a=100



#閉包函數
def func():
def func1():
print(1+1)
return func1
res=func()
print(res) #<function func.<locals>.func1 at 0x000001C68CA928C8>
res() #2

函數對象,名稱空間,作用域,閉包函數