命名空間:python所有有關命名的操作都是在操作命名空間,例如變數名,函式名
1、內建命名空間:python直譯器提供好的功能,直譯器啟動跟著一起啟動,是全域性作用域
2、全域性命名空間:python中頂行寫的,不在函式內部定義的,都是全域性命名空間,在執行的時候會產生命名空間,是全域性作用域
3、區域性命名空間:在乙個小範圍定義,只能當前範圍及其子空間內執行,例如在函式內部定義的,是區域性作用域
1、函式的巢狀呼叫
2、函式的巢狀定義
x = 1111111111111111
def f1():
#x=1
print('------>f1 ',x)
def f2():
#x = 2
print('---->f2 ',x)
def f3():
x=3print('-->f3 ',x)
f3()
f2()
f1()
1、函式可以被當做變數賦值
def foo():
print("foo")
print(foo) #列印foo的記憶體位址空間,函式的名字在不帶小括號時表示的是函式的記憶體位址
f=foo #把foo的記憶體位址空間做值賦值給f變數
print(f) #列印f,起始就是列印foo的記憶體位址空間
f() #f()事實上就是執行foo函式,等同於foo()
列印結果為
#print(foo)的結果
#print(f)的結果
foo #執行f()的結果,實際就是執行foo()的結果
2、函式可以當做引數傳遞
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=2y=3
def f2():
print(x)
yreturn 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):
res=func(*args,**kwargs)
return res
python函式巢狀閉包 閉包與巢狀函式
沒有區別,因為沒有閉合函式,不是真的。有closures,但這一術語指的是在外部和內部範圍中儲存變數的技術。只剩下巢狀函式。在 巢狀函式只是在另乙個函式內部定義的函式 def outer def inner 當outer 定義了乙個inner 然後也使用的名稱,則該變數名稱為閉包單元,儲存在inne...
Python巢狀函式 閉包
python中乙個與眾不同的語法就是可以巢狀函式,所謂巢狀,並不像其他語言中的在乙個函式中呼叫另乙個函式,而是在定義乙個函式的時候,函式體裡還能定義另乙個函式。內函式可以訪問外函式的作用域,這就是 python基礎教程 p105裡 它帶著它的環境 和相關的區域性變數 及 由於python的巢狀作用域...
函式物件 巢狀和閉包函式
精髓 可以把函式當成變數去用 func 記憶體位址 def func print from func f func 函式func賦值給變數f print f,func 列印f和func的記憶體位址,完全相同 f 相當於呼叫了函式func 輸出 func at 0x02f434a8 from func...