名稱空間:Python全部有關命名的操做都是在操做名稱空間,例如變量名,函數名 一、內置名稱空間:Python解釋器提供好的功能,解釋器啓動跟着一塊兒啓動,是全局做用域 二、全局名稱空間:Python中頂行寫的,不在函數內部定義的,都是全局名稱空間,在運行的時候會產生名稱空間,是全局做用域 三、局部名稱空間:在一個小範圍定義,只能當前範圍及其子空間內運行,例如在函數內部定義的,是局部做用域
一、函數的嵌套調用 二、函數的嵌套定義
x = 1111111111111111 def f1(): #x=1 print('------>f1 ',x) def f2(): #x = 2 print('---->f2 ',x) def f3(): x=3 print('-->f3 ',x) f3() f2() f1()
一、函數能夠被當作變量賦值
def foo(): print("foo") print(foo) #打印foo的內存地址空間,函數的名字在不帶小括號時表示的是函數的內存地址 f=foo #把foo的內存地址空間作值賦值給f變量 print(f) #打印f,起始就是打印foo的內存地址空間 f() #f()事實上就是執行foo函數,等同於foo() 打印結果爲 <function foo at 0x0000000000B91378> #print(foo)的結果 <function foo at 0x0000000000B91378> #print(f)的結果 foo #執行f()的結果,實際就是執行foo()的結果
二、函數能夠當作參數傳遞閉包
def foo(): print("foo") print(foo) #打印foo的內存地址空間 f=foo #把foo的內存地址空間作值賦值給f變量 print(f) #打印f,起始就是打印foo的內存地址空間 f() #f()事實上就是執行foo函數,等同於foo() def bar(func): print(func) #這個是打印foo()函數的內存地址 func() #func是foo的內存地址,加()實際就是執行foo()函數 return func f = bar(foo) #這個是獲取bar的返回值 print(f) #打印f,就是打印bar()的返回值,就是foo()的內存地址,和print(func)相同 f() #f是bar def bar(func): print(func) bar(foo()) #這個是先執行foo()行數,執行函數裏的代碼,先打印foo,而後把foo()的返回值做爲bar()函數的實參傳遞給bar,foo()沒有返回值,因此是None #結果就是先輸出一個 "foo" 而後bar(None),把none傳遞給bar()函數,打印No
x=1 def f1(): x=2 y=3 def f2(): print(x) y return f2 f=f1() #f是f2的內存地址 f() #f()就是f2(),能夠保證f2()能夠在任何位置執行,而不受做用域的限制 print(f.__closure__) #打印結果是元組,元組個數表明的是閉包所引用的上次函數的元素個數 print(f.__closure__[0]) #結果是元組,能夠使用索引的方式查看 print(f.__closure__[0].cell_contents) #查看指定元組所對應的應用上層參數的值
def init(func): def wrapper(*args,**kwargs): res=func(*args,**kwargs) return res return wrapper